为什么这个 Solidity 在断言后函数 return a 0?
Why does this Solidity function return a 0 after assert?
我写了这个函数:
// Function to get an owned token's id by referencing the index of the user's owned tokens.
// ex: user has 5 tokens, tokenOfOwnerByIndex(owner,3) will give the id of the 4th token.
function tokenOfOwnerByIndex(address _owner, uint256 _index) public view returns (uint _tokenId) {
// TODO: Make sure this works. Does not appear to throw when _index<balanceOf(_owner), which violates
// ERC721 compatibility.
assert(_index<balanceOf(_owner)); // throw if outside range
return ownedTokenIds[_owner][_index];
}
当 运行 的 _index 为 2 且 _owner 使得 balanceOf(_owner) 为 0 时,函数 return 在 Remix IDE 中为 0。我的假设是它不会 return 任何东西。我的问题是:
A) 为什么它在断言失败后 return 为 0?
B) 当我使用上述参数 运行 时,如何使它不 return 为 0?
谢谢,
沃恩
删除我的其他答案,因为它不正确。
错误处理条件不会在 view
函数中冒泡到客户端。它们仅用于恢复区块链上的状态更改交易。对于 view
函数,处理将停止并且指定 return 类型的初始 0 值被 returned(0 代表 uint
,false 代表 bool
,等)。
因此,view
函数的错误处理必须在客户端处理。如果您需要能够区分有效的 0 return 值与错误,您可以这样做:
function tokenOfOwnerByIndex(address _owner, uint256 _index) public view returns (uint, bool) {
bool success = _index < balanceOf(_owner);
return (ownedTokenIds[_owner][_index], success);
}
我写了这个函数:
// Function to get an owned token's id by referencing the index of the user's owned tokens.
// ex: user has 5 tokens, tokenOfOwnerByIndex(owner,3) will give the id of the 4th token.
function tokenOfOwnerByIndex(address _owner, uint256 _index) public view returns (uint _tokenId) {
// TODO: Make sure this works. Does not appear to throw when _index<balanceOf(_owner), which violates
// ERC721 compatibility.
assert(_index<balanceOf(_owner)); // throw if outside range
return ownedTokenIds[_owner][_index];
}
当 运行 的 _index 为 2 且 _owner 使得 balanceOf(_owner) 为 0 时,函数 return 在 Remix IDE 中为 0。我的假设是它不会 return 任何东西。我的问题是:
A) 为什么它在断言失败后 return 为 0?
B) 当我使用上述参数 运行 时,如何使它不 return 为 0?
谢谢, 沃恩
删除我的其他答案,因为它不正确。
错误处理条件不会在 view
函数中冒泡到客户端。它们仅用于恢复区块链上的状态更改交易。对于 view
函数,处理将停止并且指定 return 类型的初始 0 值被 returned(0 代表 uint
,false 代表 bool
,等)。
因此,view
函数的错误处理必须在客户端处理。如果您需要能够区分有效的 0 return 值与错误,您可以这样做:
function tokenOfOwnerByIndex(address _owner, uint256 _index) public view returns (uint, bool) {
bool success = _index < balanceOf(_owner);
return (ownedTokenIds[_owner][_index], success);
}