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

本文详细介绍了Solidity中结构体的定义与使用方法,包括如何创建结构体、初始化结构体及结构体的可见性等内容。
831

被折叠的 条评论
为什么被折叠?



