Solidity

我如何通過引用傳遞?

  • October 3, 2020

我有一些問題。

第一的:

所以,在一個函式中,我創建了記憶體數組。我想通過引用另一個函式來傳遞這個記憶體..

function test2() public returns(uint  a) {
       uint[2] memory gio;
       gio[0] = 100;
       gio[1] = 200;
       test3(gio);
       return gio[0];
   }
   
   
   function test3(uint[2] storage arr) private returns (uint) {
       arr[0] = 35;
   }

這不起作用並說:

函式呼叫中的參數類型無效。來自 uint256 的無效隱式轉換

$$ 2 $$記憶體到 uint256$$ 2 $$請求的儲存指針。測試3(焦);^-^

不可能嗎?

第二

內部函式和私有函式是唯一可以接收參數作為引用類型的函式類型,對吧?因為被呼叫的公共和外部函式可能依賴於另一個應用程序,所以另一個應用程序不能將參數作為引用傳遞。同意?

第三

string test;
  
   function test2() public returns(uint  a) {
       test = " awesome ";
       test3(test);
       return 10;
   }
   
   
   function test3(string storage str) private  {
       str = " changed ";
   }

為什麼呼叫會test2導致:

TypeError: type literal_string " changed " 不能隱式轉換為預期的類型字元串儲存指針。str = “改變”; ^———^

當您將參數聲明為儲存時,您將函式限制為僅接受帶有該限定符的參數。

限定符storage,memorycalldata指定數據所在的位置。您可以隱式轉換storagememorycalldatamemory但反過來是不可能的。

string public stor = "banana";

function test(string calldata calld) external view {
   string memory memo = "pizza";

   foo(memo, stor);
   foo(calld, stor);  // Creates a copy of calld in memory and passes as parameter
   foo(stor, stor);   // Creates a copy of stor in memory and passes as parameter
   
   foo(memo, stor);
   // foo(memo, memo); // Cannot convert from memory to storage
   // foo(memo, calld); // Cannot convert from calldata to storage
}

function foo(string memory, string storage) internal view {
   
}

/* This fails because you can only use calldata on external functions
function bar(string calldata) internal view {
   
} */

bool、uintXXX、bytesYY、address 等值類型是按值傳遞的。結構、數組、字元串等非值類型通過引用傳遞。

  • 函式public,internal並且private可以使用通過引用傳遞的類型,但前提是它們是從同一個合約呼叫的。
  • 函式publicexternal當被另一個合約的普通使用者呼叫時,將收到一份副本。

我不知道為什麼,但至少從 solc 0.3 開始是不允許的。

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