如何在 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;
我目前正在 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;