web-dev-qa-db-fra.com

Y at-il nul comme chose en solidité

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

 }

Si un acheteur n'est pas enregistré dans le mappage acheteur, alors customerNum ++; mais je ne sais pas comment dire si un acheteur est dans la cartographie

15
Hao WU

Vous pouvez créer la variable none pour l'utiliser en tant que NULL:

uint80 constant None = uint80(0); 
6
alper

En solidité, chaque variable est définie sur 0 par défaut.

Vous devriez penser à mappings car toutes les combinaisons possibles sont définies par défaut sur 0.

Dans votre cas spécifique, j'utiliserais les éléments suivants:

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

Il n’ya rien de tel que null en solidité.

Il suffit de vérifier la longueur de l'adresse:

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

Voir aussi cette réponse sur l’échange de piles Ethereum .

2
Afri

Comme l'a dit Viktor, la valeur par défaut pour toutes les valeurs possibles du mappage est zéro. Donc, si un buyer n'a pas encore été inséré dans le mappage, la valeur amount pour ce address sera zéro. Mais cette approche a un défaut: si un buyer existe mais que son solde est devenu nul après quelques opérations, vous le traiterez comme s'il n'existait pas. 

Je pense que la meilleure approche consiste à ajouter un membre exists à la structure buyer avec le type bool. La valeur par défaut de ce membre est false et lorsque l'acheteur est créé, vous l'initialisez avec la valeur true. Vous pouvez donc vérifier avec précision si un acheteur existe ou non via ce membre. 

Structure de l'acheteur: 

struct buyer{
   uint amount;
   Status status;
   bool exists;
}

Initialiser l'acheteur:

buyer memory b = buyer(0, status, true);

Vérifiez si l'acheteur existe:

if(buyers[msg.sender].exists) {
  //so can buy
}
1
saman.shahmohamadi