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

4

5 回答 5

14

在solidity中,每个变量都0默认设置为。

您应该认为mappings 所有可能的组合都0默认设置为。

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

if (buyers[msg.sender].amount == 0)
于 2017-11-19T02:34:48.163 回答
10

对于整数:

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

uint256 constant NULL = 0;

检查示例代码:

function isNULL(uint256 variable) internal returns (bool) {
    return variable == NULL;
}

对于bytes32

您可以采用不同的方法bytes

bytes32 constant NULL = "";

示例代码片段:

pragma solidity ^0.6.0;

mapping(address => bytes32) public Countries;   

function isCountriesInitialized(address _user) external view returns (bool) 
{
    if (Countries[_user] == NULL) // Returns true if `Countries[_user]` is not initialized
        return false;

    return true;
}

我观察到,在solidity >= 上v0.6.0它可能会返回32 的长度,即使它没有被映射。

其返回值示例:

b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'

于 2016-10-21T12:56:12.840 回答
4

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

我认为最好的方法是将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
}
于 2019-01-27T08:23:30.020 回答
4

没有什么能比得上null坚固。

只需检查地址的长度:

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

另请参阅有关以太坊堆栈交换的答案

于 2016-06-26T08:19:21.647 回答
2

boolean可以检查byte.structure

if (bytes(buyers[msg.sender]).length > 0) {
    // buyer exists.
}
于 2019-03-04T21:06:05.127 回答