【问题标题】:Are there null like thing in soliditySolidity 中是否有类似 null 的东西
【发布时间】:2016-10-17 14:04:46
【问题描述】:
    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++; 但我不知道如何判断买家是否在映射中

【问题讨论】:

标签: ethereum solidity contract


【解决方案1】:

您可以检查bytebyte 大小,而不是使用其中一个值或创建额外的boolean

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

【讨论】:

    【解决方案2】:

    对于整数:

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

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

    其返回值示例:

    b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'

    【讨论】:

      【解决方案3】:

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

      我认为最好的方法是将exists 成员添加到具有bool 类型的buyer 结构。此成员的默认值为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
      }
      

      【讨论】:

        【解决方案4】:

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

        您应该认为mappings 所有可能的组合默认设置为0

        在您的具体情况下,我会使用以下内容:

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

        【讨论】:

        • 你也可以直接说:if (buyers[msg.sender].amount) { ... }
        【解决方案5】:

        没有什么比 null 更可靠了。

        只检查地址的长度:

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

        另见this answer on ethereum stack exchange

        【讨论】:

        • 结构没有length 成员。
        猜你喜欢
        • 2021-09-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-11-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-04
        相关资源
        最近更新 更多