首页 > 解决方案 > 如何在 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 内存,我们应该返回什么?

标签: ethereumsoliditysmartcontracts

解决方案


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;

推荐阅读