[智能合约]:类型03 枚举,结构体和映射
2019-02-19 本文已影响0人
jea的笔记本
接下来看Solidity剩下的三种变量的类型:枚举,结构体和映射。
1.枚举
枚举是一个自定义的整型,有一种给数字赋予名字的感觉。在Solidity中,会根据枚举中元素的个数对应到相应的uint
类型。关键字是enum
。
contract Struct {
enum Number {Zero, One, Two, Three}
Number num;
function setNum(Number n) public {
num = n;
}
function getNum() view public returns(Number){
return num;
}
}
在上述的例子中:
-
Number
相当于一个uint8
的整型,因为枚举中个数只有三个,在uint8
的范围内。Number
中的Zero == 0
,One == 1
,Two == 2
,Three == 3
。如果超出了uint8
的范围,则对应uint16
的整形,以此类推。 - 使用
setNum
函数时,传入的值必须是0 ~ 3
,这跟我们设置的枚举元素个数是对应的,否则会报错。
2.结构体
结构体,是一些状态变量的集合。关键字是struct
。
struct Person {
string name;
uint age;
}
Person p = Person({name:"jea", age:19});
Person p1 = Person("jea",19);
- 其中两种实例化
Person
的结果是一致的。
如果采用Person p = Person({name:"jea", age:19});
的方法,可以只输入name
或age
,这意味着,没有输入的值为空。
如果采用Person p1 = Person("jea",19);
的方法,则所有的数据字段都要输入,并且类型也要对应才行。 - 通过
.
来访问结构体中的内容。如p.name
和p1.age
。
3.映射
映射,是key-value
的对应关系,也可以称为字典类型。关键字是mapping
。
mapping (string => uint) strToUint;
function setMap(string memory _s, uint _u) public {
strToUint[_s] = _u;
}
function getMap(string memory _s) view public returns(uint) {
return strToUint[_s];
}
-
通过
mapping (typeA => typeB) name;
创建,也就是创建typeA
到typeB
的映射,映射名为name
。 -
通过
strToUint[_s] = _u;
往映射中加入新值。_s
为字符串索引,如果映射中没有_s
对应的值,则在映射中加入_s
,将_s
对应的值设置为_u
;如果映射中有_s
对应的值,将该值修改为_u
。 -
通过
strToUint[_s]
获取_s
对应的值。也可以通过这种方法,判断映射中有没有索引_s
的存在。 -
注意,测试的时候,有字符串类型的要加双引号。如下: