Нуль, как вещь в солидарности
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++; но я не знаю, как определить, находится ли покупатель в картировании
Ответы
Ответ 1
В прочности каждая переменная по умолчанию установлена на 0
.
Вы должны думать о mappings
, поскольку по умолчанию все возможные комбинации установлены на 0
.
В вашем конкретном случае я бы использовал следующее:
if (buyers[msg.sender].amount == 0)
Ответ 2
Вы не могли бы создать none
переменную, чтобы использовать ее как NULL
:
uint80 constant NULL = uint80(0);
Ответ 3
Ничто не сравнится с null
.
Просто проверьте длину адреса:
if(buyers[msg.sender].length == 0){
// do your thing
}
См. также этот ответ на обмен стека ethereum.
Ответ 4
Как сказал Виктор, значение по умолчанию для всех возможных значений в отображении равно нулю. Таким образом, если 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
}
Ответ 5
Вместо использования одного из значений или создания дополнительного логического значения вы можете проверить размер структуры в байтах.
if( bytes( buyers[msg.sender] ).length > 0 ) {
// buyer exists
}