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 ++。しかし、買い手がマッピングに含まれているかどうかを知る方法がわかりません
Solidityでは、すべての変数はデフォルトで0
に設定されています。
mappings
可能な限りの組み合わせはデフォルトで0
に設定されていると考えてください。
あなたの特定のケースでは、私は次を使用します:
if (buyers[msg.sender].amount == 0)
none
変数を作成して、NULL
として使用できます。
uint80 constant NULL = uint80(0);
null
のような堅実性はありません。
住所の長さを確認してください:
if(buyers[msg.sender].length == 0){
// do your thing
}
イーサリアムスタック交換に関するこの回答 も参照してください。
Viktorが言ったように、マッピングで可能なすべての値のデフォルト値はゼロです。したがって、buyer
がまだマッピングに挿入されていない場合、そのamount
のaddress
値はゼロになります。しかし、このアプローチには欠点があります。buyer
は存在するが、何らかの操作の後にバランスがゼロになった場合、存在しないものとして扱います。
最善のアプローチは、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
}
値の1つを使用したり、追加のブール値を作成したりする代わりに、構造体のバイトサイズを確認できます。
if( bytes( buyers[msg.sender] ).length > 0 ) {
// buyer exists
}