[智能合约]:类型03 枚举,结构体和映射

接下来看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 == 0One == 1Two == 2Three == 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});的方法,可以只输入nameage,这意味着,没有输入的值为空。
    如果采用Person p1 = Person("jea",19);的方法,则所有的数据字段都要输入,并且类型也要对应才行。
  • 通过.来访问结构体中的内容。如p.namep1.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;创建,也就是创建typeAtypeB的映射,映射名为name

  • 通过strToUint[_s] = _u;往映射中加入新值。_s为字符串索引,如果映射中没有_s对应的值,则在映射中加入_s,将_s对应的值设置为_u;如果映射中有_s对应的值,将该值修改为_u

  • 通过strToUint[_s]获取_s对应的值。也可以通过这种方法,判断映射中有没有索引_s的存在。

  • 注意,测试的时候,有字符串类型的要加双引号。如下:

    [智能合约]:类型03 枚举,结构体和映射_第1张图片

你可能感兴趣的:([智能合约]:类型03 枚举,结构体和映射)