本教程解释了如何检查Solidity映射中存在的对象。
java中的映射与solidity中的哈希表相似。
它存储键和值,每个键持有值类型(原始类型),值类型是参考类型(结构、嵌套映射、数组对象)。
在solidity中,每个键都被映射为值。如果值不存在,意味着值为零。
在 solidity 中有null 或undefined 或empty 对象概念。
映射值被初始化为有效类型的值。
未初始化的映射对象的值是零。
如何检查solidity映射中的对象是否为空?
映射存储键和值,以这样的方式,每个有效的键都被映射成默认的零值的字节表示。
让我们声明一个Employee的结构,其中包含uint 的id和string 类型的名称。
struct Employee {
uint id;
string name;
}
让我们在映射中用一个字符串键来存储该结构。因此,声明并定义了mapping 结构。
mapping (string => Employee) employees;
它将字符串作为键,将值存储为Employee结构。
字符串被映射为结构默认值的字节表示。
与其他语言(java,javascript)不同,在solidity中存在空或未定义。
如果没有对象,值会被分配到零字节。
如果存在一个引用类型,比如数组或结构,那么这些值就是默认的零字节表示。
检查对象是否存在,mapping[key]== address(0x000000000000)。
下面是一个在solidity中检查对象是否为空的示例代码
// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.7.0 <0.9.0;
contract Test {
struct Employee {
uint id;
string name;
}
mapping (string => Employee) employees;
function isMappingObjectExists(string memory key) public view returns (bool) {
if(employees[key].id > 0){
return true;
}
else{
return false;
}
return false;
}
}
这包含isMappingObjectExists ,如果对象不是空的,返回true,返回false。
首先,使用语法mapping[key] ,获得一个对象的值,它返回一个struct 对象。
它检查一个结构对象的属性值是否大于零(0)。
另一种方法,是检查一个对象的bytes 长度是否为零。
function isMappingObjectExists(string memory key) public view returns (bool) {
if(bytes(employees[key]).length>0){
return true;
}
else{
return false;
}
return false;
}
这种方法,从一个给定的映射键计算出一个对象的字节,检查字节对象的长度是否大于零(0)
总结
因此,使用下面的方法检查映射值对象是否存在
- 检查对象的属性值是否为零
- 检查字节对象的长度是否为零