文章介绍了 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 在你将变量声明为公共时,会自动为其创建获取函数。然而,公共获取函数允许你提供必要的参数。
没错,你没听错。
解决方案是将嵌套映射设为私有,并将它们封装在获取其值的公共函数中。是时候实践一下了!
练习题
查看 区块链集训营 ,以了解更多关于智能合约开发和代币标准的知识。
- 原文链接: rareskills.io/learn-soli...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!