自定义结构体
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()
方法所示。