微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在 Solidity 中返回“Null”或“Empty”对象?

如何解决如何在 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 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;

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。