ethereum - 如何在 Solidity 中返回“Null”或“Empty”对象?
问题描述
我目前正在用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
正如您正确指出的那样,Solidity 没有价值。
您的函数可以使用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;
推荐阅读
- macos - ~/.zshrc 带空格的别名
- python - 在 Python 中创建 SKU 编号
- java - Java中的画布:颜色叠加问题
- android - 如何使用深度链接打开 HTTPS URL - React Native - iOS
- javascript - 根据用户选择隐藏和显示表格列
- c# - TypeError:在datagridview绑定数据源中向表添加行时表为空
- javascript - 我如何将其链接到传单上的事件?
- html - Bootstrap 4 容器 d-flex 重叠
- azure - Azure Pipeline:在 Azure DevOps 中将应用程序部署到 tomcat 服务器时出错
- oracle - 在表函数中插入表集合类型而不在 PL/SQL 中使用显式游标