Solidity

在 Solidity 中使用一條語句以聲明方式創建結構數組

  • September 5, 2022

我想創建一個接受動態數組的修飾符,如下所示:

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,那麼您當然可以將其傳遞給修飾符,如範例中所示。

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