问题描述
我目前正在solidity 编写智能合约。除其他信息外,智能合约在一般级别存储一组属性对象。属性对象看起来像这样:
struct PropertyObj {
string id;
uint weiPrice;
address owner;
}
现在有一个特定的函数可以遍历数组,找到属性并返回它(下面的代码)
function getPropertyByid(string memory _propertyId)private view returns(PropertyObj memory){
for(uint i = 0; i<PropertyArray.length; i++){
if (keccak256(bytes((PropertyArray[i].id))) == keccak256(bytes((_propertyId)))) {
return PropertyArray[i];
}
return null;
}
}
“问题”在于,与其他编程语言不同,solidity 不允许返回 null(就我而言)。
换句话说,如果在整个迭代过程中我们没有找到属性,那么如果我们在函数中指定需要返回PropertyObj memory,我们将返回什么签名?
解决方法
正如您所说的那样,Solidity 没有 null
值。
您的函数可以使用 revert() 函数抛出异常。
您的实现似乎也存在逻辑错误。如果在第一次迭代期间未找到散列,您的示例将“返回 null”。相反,您可能希望在循环结束后抛出异常。
for(uint i = 0; i<PropertyArray.length; i++){
if (keccak256(bytes((PropertyArray[i].id))) == keccak256(bytes((_propertyId)))) {
return PropertyArray[i];
}
}
revert('Not found');
如果适合您的用例,其他选项是返回空对象(具有默认值,即零)。
for(uint i = 0; i<PropertyArray.length; i++) {
// ...
}
// not found,return empty `PropertyObj`
PropertyObj memory emptyPropertyObj;
return emptyPropertyObj;