0

是否可以使 getFirst10() 工作?将 uint256[100] 内存转换为 uint256[10] 内存似乎是不可能的。

contract Test {
  uint256[100] private foo;

  function get() external view returns (uint256[100] memory) {
    return foo;               // Works
  }
  function getFirst10() external view returns (uint256[10] memory) {
    return uint256[10](foo);  // Doesn't compile
  }
}

我得到的最接近的是上面的尝试,但它失败并出现错误:Error: Explicit type conversion not allowed from "uint256[100] storage ref" to "uint256[10] storage pointer"

我想要做的是有一个函数返回一个大的 uint256[] 存储数组的子切片。有没有办法做到这一点?我是否必须返回 calldata 并复制每个元素?

4

1 回答 1

0

我认为正确的解决方案是创建一个所需固定大小的函数本地内存数组,并复制元素。在阅读了有关“存储”与“内存”的更多信息之后,我猜 EVM 在“相同大小”的情况下会为您做这件事,但除此之外似乎没有任何强制转换语法来避免编写循环自己。我不认为有性能或天然气成本影响,但可能是错误的。

  function getFirst10() external view returns (uint256[10] memory) {
    uint256[10] chunk;
    for (uint32 j = 0; j < 10; j++) {
      chunk[j] = foo[j];
    }
    return chunk;
  }
于 2021-08-24T01:24:22.830 回答