是否有类似于坚固的东西

时间:2016-06-16 07:34:16

标签: ethereum solidity contract

    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 ++; 但我不知道如何判断买家是否在映射中

5 个答案:

答案 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
}

另见this answer on ethereum stack exchange

答案 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
}