Storage

為什麼此功能不更新我的儲存陣列?

  • March 22, 2022

由於像數組這樣的引用類型在 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 關鍵字傳遞給函式參數的唯一方法是它的類型是internalorprivate.當普通使用者從另一個合約呼叫時,無論其類型(引用或值)如何,函式都將收到一份副本。對於其他使用引用傳遞的情況,請參見範例

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