Solidity

Solidity 中的局部變數

  • September 28, 2022

我有幾個關於局部變數和創建結構和數組的問題。據我了解,它們可以儲存在記憶體和儲存中。如果它們定義為狀態變數,它們將儲存在區塊鏈中。我發現我可以使用 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 直接訪問它,而不必每次都再次輸入整個內容

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