Solidity

建構子參數需要“記憶體”作為數據位置,但不需要 uint?

  • December 14, 2018

好的,我想弄清楚為什麼 Remix IDE 會拋出一個錯誤,說

必須給出數據位置“記憶體”……

對於字元串參數,但 uint 參數不會引發任何錯誤?

pragma solidity >=0.4.25 <0.6.0;

contract Monopoly {

string public player1;
uint32 public player2;
uint32 public player3;

   constructor(string memory _player1, uint32 _player2, uint32 _player3) public {
   player1 = _player1;
   player2 = _player2;
   player3 = _player3;
   }
}

看看這裡:https ://solidity.readthedocs.io/en/latest/050-break-changes.html#explicitness-requirements

結構、數組或映射類型的所有變數的顯式數據位置現在是強制性的。這也適用於函式參數和返回變數。例如,更改 uint

$$ $$x = m_x 到 uint$$ $$儲存 x = m_x 和函式 f(uint$$ $$$$ $$x) 到函式 f(uint$$ $$$$ $$memory x) 其中 memory 是數據位置,可能會相應地被 storage 或 calldata 替換。請注意,外部函式需要具有 calldata 數據位置的參數。

string是一種特定類型的數組,所以這個邏輯適用。

這類問題以及將來可能會出現此類問題是我傾向於使用特定版本pragma而不是范圍的原因之一。這樣,如果您切換編譯器(可能沒有意識到),您就不會遇到新的和奇怪的問題 - 只是對編譯器版本的抱怨。

希望能幫助到你。

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