正如您正确指出的那样,Solidity没有
我目前正在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内存,我们将返回什么?
null
值。
您的函数可以使用revert((函数引发异常。
您的实现似乎也有一个逻辑错误。你的例子是";return 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;