是否有类似于坚固的东西

问题描述 投票:16回答:5
    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 ++;但我不知道如何判断买家是否在映射中

ethereum solidity contract
5个回答
8
投票

实际上,默认情况下,每个变量都设置为0

您应该考虑mappings,因为默认情况下所有可能的组合都设置为0

在您的具体情况下,我将使用以下内容:

if (buyers[msg.sender].amount == 0)

7
投票

您可以创建none变量以将其用作NULL

uint80 constant NULL = uint80(0);


2
投票

没有像null那样坚固。

只需检查地址的长度:

if(buyers[msg.sender].length == 0){
    // do your thing
}

另见this answer on ethereum stack exchange


2
投票

正如Viktor所说,映射中所有可能值的默认值为零。因此,如果buyer尚未插入映射中,则该amountaddress值将为零。但是这种方法有一个缺陷,如果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
}

1
投票

您可以检查结构的字节大小,而不是使用其中一个值或创建额外的布尔值。

if( bytes( buyers[msg.sender] ).length > 0 ) {
    // buyer exists
}
© www.soinside.com 2019 - 2024. All rights reserved.