Solidity
Solidity 中的局部變數
我有幾個關於局部變數和創建結構和數組的問題。據我了解,它們可以儲存在記憶體和儲存中。如果它們定義為狀態變數,它們將儲存在區塊鏈中。我發現我可以使用 new 子句將記憶體數組創建為局部變數並指定數組大小。但是我找不到將數組(或結構)聲明為函式內部的儲存數組的方法。可以嗎?我唯一理解的是,我可以創建一個指向已存在數組的儲存指針,該數組定義為狀態變數。這是另一個問題,如果通過更改它來更改原始數組,為什麼我們需要一些?還有一個關於文件中以下陳述的問題:
Local Variables of structs, array are always stored in storage by default.
你能舉個例子嗎?//local variables testing uint[] public some_arr; function test_local_var() public { some_arr.push(1); some_arr.push(2); some_arr.push(3); uint[] storage new_arr = some_arr;//Why do we need to create a storage pointer to array if by changing it we change an original array new_arr[0]=3232; new_arr.push(4); uint[] memory new_arr2 = new uint[](7); //how to create storage array inside of a function? I found the way how to create memory arrays }
先感謝您!
如何在函式內部創建儲存數組?
你不能這樣做,根本不可能在函式內部創建新的儲存槽。(好吧,你可以在彙編中做到這一點,但你只能通過彙編讀寫來管理該插槽,你將無法命名它並在之後完全訪問它)。
如果通過更改原始數組,為什麼我們需要創建指向數組的儲存指針
好吧,我們沒有。它只是作為編寫更簡潔程式碼的捷徑。讓我們以這種儲存佈局為例。
struct SomeStruct{ uint256 a; uint256[] b; //... } mapping(address => mapping(address => SomeStruct[]) someAnnoyingToAccessMapping;
現在假設我想在我煩人的映射中的一個結構中修改 b 。我可以花 2 個小時重寫
someAnnoyingToAccessMapping[someAddr1][someAddr2].b[...];
一遍又一遍,或者我可以寫
uint256[] storage toModify = someAnnoyingToAccessMapping[address][address].b;
一次,然後使用 toModify 直接訪問它,而不必每次都再次輸入整個內容