是否有类似于坚固的东西

Hao*_* WU 18 contract ethereum solidity

    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);

 }
Run Code Online (Sandbox Code Playgroud)

如果买方没有记录在买方映射中,那么buyerNum ++; 但我不知道如何判断买家是否在映射中

Vik*_*amp 8

实际上,每个变量都0默认设置为.

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

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

if (buyers[msg.sender].amount == 0)
Run Code Online (Sandbox Code Playgroud)


alp*_*per 7

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

__PRE__


sam*_*adi 5

正如 Viktor 所说,映射中所有可能值的默认值为零。因此,如果 abuyer尚未插入映射,amount则其值address将为零。但这种方法有一个缺陷,如果abuyer确实存在,但经过一些操作后它的余额变为零,你会认为它不存在。

我认为最好的方法是existsbuyer具有类型的结构添加成员bool。该成员的默认值为false,当创建买家时,您可以使用true值对其进行初始化。这样您就可以通过该会员准确查询买家是否存在。

买家结构:

struct buyer{
   uint amount;
   Status status;
   bool exists;
}
Run Code Online (Sandbox Code Playgroud)

初始化买家:

buyer memory b = buyer(0, status, true);
Run Code Online (Sandbox Code Playgroud)

检查买家是否存在:

if(buyers[msg.sender].exists) {
  //so can buy
}
Run Code Online (Sandbox Code Playgroud)


Afr*_*Afr 4

没有什么比null坚固更重要了。

只需检查地址的长度:

if(buyers[msg.sender].length == 0){
    // do your thing
}
Run Code Online (Sandbox Code Playgroud)

另请参阅以太坊堆栈交换上的这个答案

  • 结构没有“length”成员。 (2认同)