{"content":{"title":"Solidity 嵌套映射","body":"在大多数语言中，hashmap 可以包含另一个 hashmap，Solidity 也是如此。不过，由于 mappings 不是有效的返回类型，你必须提供 maps 所需的所有键。\r\n\r\n让我们看一个例子\r\n\r\n```solidity\r\n\r\ncontract ExampleContract {\r\n\r\n    mapping(uint256 => mapping(uint256 => uint256)) public nestedMap;\r\n\r\n    function setNestedMap(\r\n        uint256 key1,\r\n        uint256 key2,\r\n        uint256 finalValue\r\n    )\r\n        public {\r\n            nestedMap[key1][key2] = finalValue;\r\n    }\r\n\r\n    function getNestedMap(\r\n        uint256 key1,\r\n        uint256 key2\r\n    )\r\n        public\r\n        view\r\n        returns (uint256) {\r\n            return nestedMap[key1][key2];\r\n    }\r\n}\r\n\r\n```\r\n\r\n嵌套映射在智能合约中相当常见，不同于嵌套数组。例如，你可以这样做账务管理\r\n\r\n```solidity\r\n\r\ncontract TrackDebt {\r\n\r\n    mapping(address => mapping(address => uint256)) public amountOwed;\r\n\r\n    function setAmountOwed(\r\n        address borrower,\r\n        address lender,\r\n        uint256 amount\r\n    )\r\n        public {\r\n            amountOwed[lender][borrower] = amount;\r\n    }\r\n}\r\n\r\n```\r\n\r\n请注意，这里顺序很重要。在这个结构中，一个贷方可以有多个借款人。如果我们将借款人设为第一个键，那将意味着一个借款人可能有多个债务人。\r\n\r\n适用于常规 mappings 的相同限制也适用于嵌套 mappings。你不能遍历键，无法在函数内声明它们，也不能从函数中返回它们。\r\n\r\n**公共嵌套映射不起作用**\r\n\r\n这里还有一个 Solidity 的奇怪缺陷。Solidity 在你将变量声明为公共时，会自动为其创建获取函数。然而，公共获取函数允许你提供必要的参数。\r\n\r\n没错，你没听错。\r\n\r\n解决方案是将嵌套映射设为私有，并将它们封装在获取其值的公共函数中。是时候实践一下了！\r\n\r\n**练习题**\r\n\r\n[NestedMapping](https://github.com/RareSkills/Solidity-Exercises/tree/main/NestedMapping)\r\n\r\n[TripleNestedMapping](https://github.com/RareSkills/Solidity-Exercises/tree/main/TripleNestedMapping)\r\n\r\n###  了解更多\r\n\r\n查看  [区块链集训营](https://learnblockchain.cn/openspace/1) ，以了解更多关于智能合约开发和代币标准的知识。\r\n\r\n \r\n\r\n>- 原文链接： [rareskills.io/learn-soli...](https://www.rareskills.io/learn-solidity/nested-mapping)\r\n>- 登链社区 AI 助手，为大家转译优秀英文文章，如有翻译不通的地方，还请包涵～"},"author":{"user":"https://learnblockchain.cn/people/20722","address":null},"history":null,"timestamp":1740625131,"version":1}