Solidity 嵌套映射

文章介绍了 Solidity 语言中嵌套映射(Nested Mappings)的使用方法,包括如何声明、设置和获取嵌套映射的值,并指出嵌套映射不能作为函数的返回类型或迭代。

在大多数语言中,hashmap 可以包含另一个 hashmap,Solidity 也是如此。不过,由于 mappings 不是有效的返回类型,你必须提供 maps 所需的所有键。

让我们看一个例子


contract ExampleContract {

    mapping(uint256 => mapping(uint256 => uint256)) public nestedMap;

    function setNestedMap(
        uint256 key1,
        uint256 key2,
        uint256 finalValue
    )
        public {
            nestedMap[key1][key2] = finalValue;
    }

    function getNestedMap(
        uint256 key1,
        uint256 key2
    )
        public
        view
        returns (uint256) {
            return nestedMap[key1][key2];
    }
}

嵌套映射在智能合约中相当常见,不同于嵌套数组。例如,你可以这样做账务管理


contract TrackDebt {

    mapping(address => mapping(address => uint256)) public amountOwed;

    function setAmountOwed(
        address borrower,
        address lender,
        uint256 amount
    )
        public {
            amountOwed[lender][borrower] = amount;
    }
}

请注意,这里顺序很重要。在这个结构中,一个贷方可以有多个借款人。如果我们将借款人设为第一个键,那将意味着一个借款人可能有多个债务人。

适用于常规 mappings 的相同限制也适用于嵌套 mappings。你不能遍历键,无法在函数内声明它们,也不能从函数中返回它们。

公共嵌套映射不起作用

这里还有一个 Solidity 的奇怪缺陷。Solidity 在你将变量声明为公共时,会自动为其创建获取函数。然而,公共获取函数允许你提供必要的参数。

没错,你没听错。

解决方案是将嵌套映射设为私有,并将它们封装在获取其值的公共函数中。是时候实践一下了!

练习题

NestedMapping

TripleNestedMapping

了解更多

查看 区块链集训营 ,以了解更多关于智能合约开发和代币标准的知识。

  • 原文链接: rareskills.io/learn-soli...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
RareSkills
RareSkills
https://www.rareskills.io/