struct buyer {
uint amount;
Status status;
}
mapping(address=>buyer) public buyers;
mapping(uint=>address) buyerIndex;
uint public buyerNum;
// Order a product.
function() {
uint doubleValue=value*2;
uint amount=msg.value/doubleValue;
if(buyers[msg.sender]==null) { // Error in this line
buyer abuyer=buyer({amount:amount,status:Status.Created}); // Error in this line
buyerNum++;
buyerIndex[buyerNum]=msg.sender;
buyers[msg.sender]=abuyer;
}
else {
buyers[msg.sender].amount+=amount;
}
Order(msg.sender,amount*doubleValue,amount);
}
如果买家映射中未记录买家,则买家编号++; 但我不知道如何判断买家是否在映射中
在solidity中,默认情况下,每个变量都设置为0
。
您应该考虑mappings
因为默认情况下所有可能的组合都设置为0
。
在您的特定情况下,我会使用以下方法:
if (buyers[msg.sender].amount == 0)
对于整数:
您可以创建none
变量以将其用作NULL
:
uint256 constant NULL = 0;
检查示例代码:
function isNULL(uint256 variable) internal returns (bool) {
return variable == NULL;
}
对于bytes32
:
您可以遵循不同的方法进行bytes
:
bytes32 constant NULL = "";
示例代码段:
pragma solidity ^0.6.0;
mapping(address => bytes32) public Countries;
function isCountriesInitialized(address _user) external view returns (bool)
{
if (Countries[_user] == NULL) // Returns true if `Countries[_user]` is not initialized
return false;
return true;
}
我观察到,在坚固性>=v0.6.0
上,即使它没有被映射,它也可能返回 32 的长度。
其返回值的示例:
b'x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00'
正如 Viktor 所说,映射中所有可能值的默认值为零。因此,如果尚未在映射中插入buyer
,则该address
的amount
值将为零。但是这种方法有一个缺陷,如果一个buyer
确实存在,但在某些操作后它的余额变为零,你会把它当作不存在。
我认为最好的方法是使用bool
类型向buyer
结构添加一个exists
成员。此成员的默认值为false
,创建买方时,您可以使用true
值对其进行初始化。因此,您可以通过此会员准确检查是否存在买家。
买方结构:
struct buyer{
uint amount;
Status status;
bool exists;
}
初始化买家:
buyer memory b = buyer(0, status, true);
检查买家是否存在:
if(buyers[msg.sender].exists) {
//so can buy
}
在坚固性方面没有什么比null
更像了。
只需检查地址的长度:
if(buyers[msg.sender].length == 0){
// do your thing
}
另请参阅以太坊堆栈交换的答案。
无需使用其中一个值或创建额外的boolean
,您可以检查structure
的byte
大小。
if (bytes(buyers[msg.sender]).length > 0) {
// buyer exists.
}