自定义结构体
pragma solidity ^0.4.4; contract Students { struct Person { uint age; uint stuID; string name; } }
Person
就是我们自定义的一个新的结构体类型,结构体里面可以存放任意类型的值。
怎么理解结构体:如果我们要描述一个人,需要说明他的姓名、年龄、性别、身高等方面,如果每添加一个人就要写一遍name=“zhangshan”,age=28。。。太过麻烦,可以把这些描述的各个变量整合为一个结构体,调用这个结构体就意味着要添加一个人进去
数组,映射,结构体也支持自定义的结构体。我们来看一个自定义结构体的例子:
pragma solidity ^0.4.0; contract SimpleStruct{ //学生 struct Student{ string name; int num; } //班级 struct Class{ string clsName; //学生的列表 Student[] students; mapping(string=>Student)index; } }
在上面的代码中,我们定义了一个简单的结构体Student
,它包含一些基本的数据类型。另外我们还定义了一个稍微复杂一点的结构体Class
,它包含了其它结构体Student
,以及数组,映射等类型。Student[ ] students说明结构体可以看成是一个值类型,用法和uint等类型差不多。
数组类型的students
和映射类型的index
的声明中还使用了结构体。
初始化一个结构体
- 方法一
pragma solidity ^0.4.4; contract Students { struct Person { uint age; uint stuID; string name; } #括号内的参数和结构体内的变量一一对应,等同于age=18,stuID=101,name="james" Person _person = Person(18,101,"james"); Person jack=Person(28,102,"jack"); }
- 方法二
pragma solidity ^0.4.4; contract Students { struct Person { uint age; uint stuID; string name; } #相比方法一,这一个更清晰但需要多输入三个变量的名字,输入顺序可以改变,自己取舍 Person _person = Person({age:18,stuID:101,name:"james"}); }
结构体的可见性:
关于可见性,目前只支持internal,所以结构体只能在合约内部和子合约内使用。包含结构体的函数必须显性声明为internal
例子:
pragma solidity ^0.4.0; contract A{ struct S{ string para1; int para2; } //这个函数的参数类型是上面定义的结构体S,因此需要显性声明为internal function f(S s) internal{ //... } function f1(){ //当前类中使用结构体 S memory s = S("Test", 10); f(s); } } contract B is A{ function g(){ //子合约中使用结构体 S memory s = S("Test", 10); //调用父类方法 f(s); } }
在上面的代码中,我们声明了f(S s)
,由于它包含了struct
的S
,所以不对外可见,需要标记为internal
。你可以在当前类中使用它,如f1()
所示,你还可以在子合约中使用函数和结构体,如B
合约的g()
方法所示。