Storage
為什麼此功能不更新我的儲存陣列?
由於像數組這樣的引用類型在 Solidity 中是通過引用傳遞的,所以它們傳遞了一個指向值的引用(指針)。對該值的任何更改都將反映在原始值上。
如果是這種情況,為什麼
changeVar()
函式不改變標記數組的值?pragma solidity ^0.8.0; contract ref { uint[] public marks = [1,2,33]; function changeVar() public { changeVal(marks); } function changeVal(uint[] memory _uint) public returns(uint[] memory){ _uint[0] = 111; } }
您將
memory
修飾符添加到_uint
參數中。這意味著無論您傳遞給changeVal
函式的值是什麼,該數組都將在記憶體中處理,而不是在儲存中。所以回答你的觀點,這確實是一個引用,但它是對保存在記憶體中的數組的引用。如果您想對儲存陣列進行操作和修改,您需要將修飾符更改為
storage
.您可能會受益於閱讀Solidity 文件的記憶體佈局部分。
pragma solidity ^0.7.0; contract ref { uint[] public marks = [1,2,33]; function changeVar() external { changeVal(marks); } function changeVal(uint[] storage _uint) internal{ _uint[0] = 111; } }
將 storage 關鍵字傳遞給函式參數的唯一方法是它的類型是
internal
orprivate.
當普通使用者從另一個合約呼叫時,無論其類型(引用或值)如何,函式都將收到一份副本。對於其他使用引用傳遞的情況,請參見範例。