如何在 Solidity 中 return "Null" 或 "Empty" 对象?

How to return "Null" or an "Empty" object in Solidity?

我目前正在 Solidity 中编写 智能合约 。除其他信息外,智能合约在一般级别存储一组属性对象。 属性 对象看起来像这样:

    struct PropertyObj {
    string id;
    uint weiPrice;
    address owner;
}

现在有一个特定的函数遍历数组,找到 属性 和 returns 它(下面的代码

    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 不允许 return null(就我而言)。

换句话说,如果在整个迭代过程中我们没有找到 属性,那么我们应该 return 如果我们指定我们需要 return 函数签名中的PropertyObj内存?

Solidity 没有 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');

其他选项是 return 空对象(具有默认值,即零),如果它适合您的用例。

for(uint i = 0; i<PropertyArray.length; i++) {
    // ...
}

// not found, return empty `PropertyObj`
PropertyObj memory emptyPropertyObj;
return emptyPropertyObj;