Solidity

未使用的函式參數。刪除或註釋掉變數名以消除此警告

  • August 14, 2021

我有一個智能聯繫人,它有 2 個所有者地址和 3 個功能。

我的設置函式是使用 msg.sender 設置使用者,我的 getUser 函式是返回姓名、姓氏和年齡,我想添加一個可以將使用者設置為 . 此 setUsersbyAdmin 函式採用地址參數設置名稱、姓氏和 ag。

我的智能合約在 remix 上執行良好,但我嘗試 truffle 編譯它失敗了。

這是程式碼:

pragma solidity >=0.4.0 <0.7.0;

contract NewHello{ 

   address owner;
   address newOwner;

   constructor()public{
       owner = msg.sender;
   }

   modifier onlyOwner (){
       if(msg.sender != owner){
           require(msg.sender == newOwner);
           _;
       }
       else{
           require(msg.sender == owner);
           _;
       }

   }

   struct user{
       string name;
       string surname;
       uint age;
   }
    event infoChanged(
       string name,
       string surname,
       uint age
   );

   mapping(address => user) public users; // contains a user for every address

   function setUser(string memory name,string memory surname,uint age) public payable{
       users[msg.sender] = user(name,surname,age);
       emit infoChanged(name,surname,age);
   }
   function setUserbyAdmin(address _address, string memory name,string memory surname,uint age) public payable onlyOwner{
       users[msg.sender] = user(name,surname,age);
       emit infoChanged(name,surname,age);
   }

   function getUser(address _address) public view returns(string memory name , string memory surname, uint age)  {

       return (users[_address].name,users[_address].surname,users[_address].age);        
   }
}

當我用松露編譯它時,我在視窗上看到一個錯誤,上面寫著:

警告:未使用的函式參數。刪除或註釋掉變數名稱以消除此警告。function setUserbyAdmin(address _address, string memory name,string memory surname,uint age) public paid onlyOwner{ ^————–^

嘿伙計們,我解決了這個問題。這是程式碼:

pragma solidity >=0.4.0 <0.7.0;

contract NewHello {
   address owner;
   address newOwner;
   constructor()public{
       owner = msg.sender;
   }

   modifier onlyOwner() {
       if (msg.sender != owner) {
           require(msg.sender == newOwner);
       } else {
           require(msg.sender == owner);
           _;
       }
   }

   struct user {
       string name;
       string surname;
       uint age;
   }
   
   event infoChanged(
       string name,
       string surname,
       uint age
   );

   mapping(address => user) public users; // contains a user for every address

   function setUser(string memory name,string memory surname,uint age) public payable {
       users[msg.sender] = user(name,surname,age);
       emit infoChanged(name,surname,age);
   }
   
   function setUserbyAdmin(address _address,string memory name,string memory surname,uint age) public payable {
       users[_address] = user(name,surname,age);
       emit infoChanged(name,surname,age);
   }

   function getUser(address _address) public view returns(string memory name , string memory surname, uint age) {
       return (users[_address].name,users[_address].surname,users[_address].age);        
   }
}

如果您查看編譯器頁面,您將在 Remix 中看到相同的警告。

警告很清楚:您有一個變數,該變數未在函式邏輯的任何地方使用。這不是錯誤,但編譯器正試圖通過刪除不需要的參數來幫助您節省氣體並使函式更清潔。如果你願意,你可以忽略警告。

有一個奇怪的功能,如果您刪除變數名,警告就會消失。但是該函式仍然具有相同的簽名。我實際上不知道為什麼會實施這樣的事情。

引用自:https://ethereum.stackexchange.com/questions/72486