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 ++; 但我不知道如何判断买家是否在映射中
实际上,每个变量都0默认设置为.
您应该考虑默认情况下将mappings 所有可能的组合设置为0.
在您的具体情况下,我将使用以下内容:
if (buyers[msg.sender].amount == 0)
Run Code Online (Sandbox Code Playgroud)
正如 Viktor 所说,映射中所有可能值的默认值为零。因此,如果 abuyer尚未插入映射,amount则其值address将为零。但这种方法有一个缺陷,如果abuyer确实存在,但经过一些操作后它的余额变为零,你会认为它不存在。
我认为最好的方法是exists向buyer具有类型的结构添加成员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)
没有什么比null坚固更重要了。
只需检查地址的长度:
if(buyers[msg.sender].length == 0){
// do your thing
}
Run Code Online (Sandbox Code Playgroud)
另请参阅以太坊堆栈交换上的这个答案。