NULL in Solidity

Inexistent NULL in Solidity

作者:孔令坤,转载请注明出处

在Solidity中,并没有Null值的存在。所有的变量在初始化后都会被默认为0值。这导致我们在写代码的时候需要多加注意。

比如之前我遇到的enum

1
2
enum State { Created, Locked, Inactive }
// Created = 0, Locked = 1, Inactive = 2

之后,代码在没有对myState变量进行赋值的情况下,直接判断:

1
require(myState == Created.Created);

所以这个时系统断定判断通过,而且并不会报错。

那么,如何判断mapping中是否某个键是否”为空”呢?

比较标准的做法是建立一个专门和value相关的结构体,用一个布尔型变量来看是否这个key所对应的value被赋过值,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
library Library {
struct data {
uint val;
bool isValue;
}
}
contract myContract{
using Library for Library.data;
mapping(address => Library.data) cluster;
function ifExist(address id) returns(bool){
if(cluster[id].isValue) return true;
return flase;
}
function addCluster(address id){
if(cluster[id].isValue) throw; // duplicate key
// add ...
cluster[id].isValue = true;
}
//...
}

此外,我们也可以简单的来看一下value所对应的length来判断这个值是否被赋值过(零值无法判断!):

1
2
3
4
mapping(address => uint) public deposits;
if(deposits[msg.sender].length == 0){
// deposit[msg.sender] is empty, do your thing
}

如果我们不用判断某个变量是否为赋过值后的零值时,我建议用第二种通过length来判断的方法,因为后者将大大减少合约gas的消耗。