【问题标题】:how to delete item of array in solidity如何在solidity中删除数组项
【发布时间】:2022-08-05 01:47:31
【问题描述】:

我正在尝试牢固地删除数组的某个项目。
我正在探索一些文章。
https://ethereum.stackexchange.com/questions/1527/how-to-delete-an-element-at-a-certain-index-in-an-array

当然,我不需要item的空值。我需要完全删除该项目。

uint[] payees = [1, 2, 3, 4, 5];

delete payees[0]

// result - I don\'t need this result

[0, 2, 3, 4, 5]

//I need [2, 3, 4, 5]

所以我使用了这个功能。

function removePayee(
        uint256 index
    ) internal {
        if (index >= payees.length) return;

        for (uint i = index; i<payees.length-1; i++){
            payees[i] = payees[i+1];
        }
        delete payees[payees.length-1];
        payees.length--;
    }

发生以下错误。

Member \"length\" is read-only and cannot be used to resize arrays.

请帮我。

    标签: solidity smartcontracts


    【解决方案1】:

    @Petr Hejda 已经给出了答案。您只需要删除最后两行代码并添加“pop()”即可。

        uint[] payees = [1, 2, 3, 4, 5];
    
        function removePayee(uint256 index) external {
            if (index >= payees.length) return;
    
            for (uint i = index; i<payees.length-1; i++){
                payees[i] = payees[i+1];
            }
            payees.pop();
        }
    

    此外,可选:我将使用“require”而不是“if 语句”。但这暂时不会影响代码。

    【讨论】:

      【解决方案2】:

      您需要使用数组上的.pop() 函数来删除最后一项。

      payees.pop();
      

      文档:https://docs.soliditylang.org/en/v0.8.12/types.html#array-members

      从 0.6 版开始,.length-- 方法无效。

      【讨论】:

        【解决方案3】:

        据我所知,在solidity 0.6.0之后没有人使用payees.length--不再 为了替换 delete 关键字的零值暴露,我们应该在函数输入处选择索引后将元素替换回一个索引。

        所以你应该使用 payees.pop() 而不是 payees.length--

        【讨论】:

          猜你喜欢
          • 2022-09-24
          • 2021-10-19
          • 2013-02-23
          • 2018-01-14
          • 2016-09-07
          • 2013-12-02
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多