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);
}
如果买家没有记录在买家映射中,那么buyerNum ++; 但我不知道如何判断买家是否在映射中
答案 0 :(得分:7)
在稳固性方面,默认情况下,每个变量都设置为0
。
您应该考虑mappings
,因为所有可能的组合默认设置为0
。
在您的具体情况下,我会使用以下内容:
if (buyers[msg.sender].amount == 0)
答案 1 :(得分:6)
您可以创建none
变量,将其用作NULL
:
uint80 constant None = uint80(0);
答案 2 :(得分:2)
没有像null
那样坚固。
只需检查地址的长度:
if(buyers[msg.sender].length == 0){
// do your thing
}
答案 3 :(得分:1)
如Viktor所说,映射中所有可能值的默认值为零。因此,如果尚未在映射中插入buyer
,则该amount
的{{1}}值将为零。但是这种方法有一个缺陷,如果确实存在address
,但在执行某些操作后其余额变为零,则您将其视为不存在。
我认为最好的方法是向buyer
类型的exists
结构中添加一个buyer
成员。该成员的默认值为bool
,创建买家后,您可以使用false
值对其进行初始化。因此,您可以通过此成员确切检查买家是否存在。
买方结构:
true
初始化买方:
struct buyer{
uint amount;
Status status;
bool exists;
}
检查买方是否存在:
buyer memory b = buyer(0, status, true);
答案 4 :(得分:1)
您可以检查结构的字节大小,而不用使用值之一或创建额外的布尔值。
if( bytes( buyers[msg.sender] ).length > 0 ) {
// buyer exists
}