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
。
您应该考虑mappings
,因为默认情况下所有可能的组合都设置为0
。
在您的具体情况下,我将使用以下内容:
if (buyers[msg.sender].amount == 0)
您可以创建none
变量以将其用作NULL
:
uint80 constant NULL = uint80(0);
没有像null
那样坚固。
只需检查地址的长度:
if(buyers[msg.sender].length == 0){
// do your thing
}
正如Viktor所说,映射中所有可能值的默认值为零。因此,如果buyer
尚未插入映射中,则该amount
的address
值将为零。但是这种方法有一个缺陷,如果buyer
确实存在,但是在一些操作之后它的平衡变为零,你会将它视为不存在。
我认为最好的方法是使用exists
类型将buyer
成员添加到bool
结构中。此成员的默认值为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
}
您可以检查结构的字节大小,而不是使用其中一个值或创建额外的布尔值。
if( bytes( buyers[msg.sender] ).length > 0 ) {
// buyer exists
}