Solidity
在 Solidity 中使用一條語句以聲明方式創建結構數組
我想創建一個接受動態數組的修飾符,如下所示:
modifier parameterizedTest(Set[] memory sets) { // ... }
結構
Set
定義如下:struct Set { uint256 x; uint256 y; uint256 expected; }
現在,我知道通常必須使用多個語句來定義數組,如下所示:
Set[] memory sets = new Set[](1); sets.push(Set(1,2,3));
但是有沒有辦法“捷徑”這種方法?理想情況下,我想以聲明方式將我的數組傳遞給修飾符,如下所示:
function testSomething() external parameterizedTest([Set(1,2,3)]) { // ... }
我知道上面的程式碼無法編譯。我寫它只是為了展示目的。
不幸的是,該語法尚不受支持。將來可能會支持它。
看看這個程式碼片段:
//SPDX-License-Identifier: MIT pragma solidity ^0.8.6; contract Counter { uint256[] ints = [1,2,3]; // This syntax for value-type is supported bytes[] bs = [bytes("")]; // Works string[] strs = ["one", "two"]; // Works // uint256[][] = [[1,2,3]]; // Does not work // Set[] sets = [Set(1,2,3)]; // This syntax is not yet supported for structs because `Set(1,2,3)` is considered to be in memory and it cannot be assigned to storage like this struct Set { uint256 x; uint256 y; uint256 expected; } modifier parameterizedTest(Set[] memory sets) { // ... _; } function testSomething(Set[] memory _sets) external parameterizedTest(_sets) { // ... } }
有一種同時聲明狀態數組和賦值的簡寫方式,但它不適用於結構數組,因為這樣的語句
Set(1,2,3)
被認為是在記憶體中,不能從儲存中分配。如果您的
testSomething
函式接收到Set[] memory _sets
,那麼您當然可以將其傳遞給修飾符,如範例中所示。