Solidity
我如何通過引用傳遞?
我有一些問題。
第一的:
所以,在一個函式中,我創建了記憶體數組。我想通過引用另一個函式來傳遞這個記憶體..
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
,memory
並calldata
指定數據所在的位置。您可以隱式轉換storage
為memory
和calldata
,memory
但反過來是不可能的。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
可以使用通過引用傳遞的類型,但前提是它們是從同一個合約呼叫的。- 函式
public
,external
當被另一個合約的普通使用者呼叫時,將收到一份副本。我不知道為什麼,但至少從 solc 0.3 開始是不允許的。