固体中是否有空的东西


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

如果买家映射中未记录买家,则买家编号++; 但我不知道如何判断买家是否在映射中

在solidity中,默认情况下,每个变量都设置为0

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

在您的特定情况下,我会使用以下方法:

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

对于整数:

您可以创建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;
}

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

其返回值的示例:

b'x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00'

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

我认为最好的方法是使用bool类型向buyer结构添加一个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
}

在坚固性方面没有什么比null更像了。

只需检查地址的长度:

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

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

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

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

最新更新