映射(Mappings)
映射类型定义方式为mapping(_KeyType => _KeyValue)
。键类型允许除映射、变长数组、合约、枚举、结构体外的几乎所有类型()。值类型没有任何限制,可以为任何类型包括映射类型。
映射可以被视作为一个Hash table,所有可能的键会被虚拟化的创建,映射到一个类型的默认值(二进制的全零表示)。在映射表中,并不存储键的数据,仅仅存储它的keccak256
哈希值,这个哈希值在查找值时需要用到。
因此,映射是没有长度的,也没有键集合或值集合的概念。
映射类型,仅能用来作为状态变量,或在内部函数中作为storage类型的引用。
可以通过将映射标记为public
,来让Solidity创建一个getter。通过提供一个键做为参数来访问它,将返回对应的值。
映射的值类型也可以是映射,使用getter访问时,要提供这个映射值所对应的键。
pragma solidity ^0.4.0;
contract MappingExample {
mapping(address => uint) public balances;
function update(uint newBalance) public {
balances[msg.sender] = newBalance;
}
}
contract MappingUser {
function f() public returns (uint) {
MappingExample m = new MappingExample();
m.update(100);
return m.balances(this);
}
}
注解 |
---|
映射不是可迭代的,但可以在它们上面实现数据结构。例如,请参见迭代映射。 |