Solidity
如何從 Solidity 中的記憶體數組中彈出(減少長度)
我有一個從另一個合約中獲取地址數組的函式,有條件地從數組中刪除 msg.sender,然後將新數組保存回該合約。
因為數組 backerList 在記憶體中,所以我做不到
backerList.length--;
但是我不能將 backerList 聲明為儲存數組,因為記憶體數組無法轉換為儲存數組。
我被困在這裡,我該怎麼辦?
address[] memory backerList = syndicate.getBackerList(); if(syndicate.individualTotalBacking(msg.sender) == 0){ uint index; for(uint i=0; i<backerList.length; i++){ if (backerList[i] == msg.sender){ index = i; } //shifting array for(uint k=index; k<backerList.length-1; k++){ backerList[k]=backerList[k+1]; } } backerList.length--; syndicate.setBackerList(backerList); } else {}
這是一種
backerList.length--;
使用address[] memory backerList
內聯彙編的方法:assembly { mstore(backerList, sub(mload(backerList), 1)) }
需要記住的一些要點:
- 確保此彙編程式碼在
backerList.length == 0
(不允許數組長度下溢)時永遠不會執行- 不要嘗試使用它來增加數組的大小(通過替換
sub
為add
)- 僅在具有類似類型的變數上使用它
...[] memory
(例如,不要在 aaddress[10] memory
or上使用它address
)免責聲明:通常不建議使用內聯彙編。謹慎使用,風險自負:)