成员“push”在存储之外的 bool[] 内存中不可用

may*_*ava 4 solidity

我正在尝试在 Solidity 中进行简单的推送操作。如下面函数 isArrayEven() 的代码所示:

pragma solidity ^0.8.12;

contract Test {
    uint[] public arr = [uint(1), 2, 3, 4, 5, 6, 7, 8 ,9];

    function isArrayEven() public view returns(bool[] memory) {
        bool[] memory ret;

        for (uint i = 0; i < arr.length; i++) {
            ret.push((arr[i]%2 == 0));
        }

        return ret;
    }
}
Run Code Online (Sandbox Code Playgroud)

但会抛出以下错误:

成员“push”在存储之外的 bool[] 内存中不可用。

我已经弄清楚如何通过使用以下方法来解决此问题:

pragma solidity ^0.8.12;

contract Test {
    uint[] public arr = [uint(1), 2, 3, 4, 5, 6, 7, 8 ,9];

    function isArrayEven() public view returns(bool[] memory) {
        bool[] memory ret = new bool[](arr.length);

        for (uint i = 0; i < arr.length; i++) {
            ret[i] = (arr[i]%2 == 0);
        }

        return ret;
    }
}
Run Code Online (Sandbox Code Playgroud)

但我不明白这种行为,为什么内存数组不允许“推送”?

小智 11

可以使用 new 运算符创建具有动态长度的内存数组。与存储数组相反,无法调整内存数组的大小(例如,.push 成员函数不可用)。您要么必须提前计算所需的大小,要么创建一个新的内存数组并复制每个元素。 https://docs.soliditylang.org/en/v0.8.12/types.html#alaving-memory-arrays