在Solidity中是否有类似于null的东西?

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


如果一个买家没有在买家映射中记录,那么买家数量就会增加; 但是我不知道如何判断一个买家是否在映射中。

5个回答

22

在Solidity中,每个变量默认都被设置为0

你应该将mappings视为所有可能的组合默认都被设置为0

针对你的特定情况,我会使用以下内容:

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

你也可以这样写:if (buyers[msg.sender].amount) { ... } - alper

13

对于整数:

你可以创建一个 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'


5
正如 Viktor 所说,映射中所有可能值的默认值都为零。因此,如果一个“买家”尚未插入映射中,则该“地址”的“金额”值将为零。但这种方法有一个缺陷,如果一个“买家”确实存在,但其余额在某些操作后变为零,您将把它视为不存在。
我认为最好的方法是向“买家”结构体添加一个具有布尔类型的“exists”成员。此成员的默认值为 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
}

4

在Solidity中没有像null这样的东西。

只需检查地址的长度:

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

请参考以太坊技术问答社区中的这个回答。

2
结构体没有 length 成员。 - saman.shahmohamadi

2

不必使用其中一个值或创建额外的boolean,您可以检查structurebyte大小。

if (bytes(buyers[msg.sender]).length > 0) {
    // buyer exists.
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接