Solidity语言学习笔记————15、结构体Struct

自定义结构体

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),由于它包含了structS,所以不对外可见,需要标记为internal。你可以在当前类中使用它,如f1()所示,你还可以在子合约中使用函数和结构体,如B合约的g()方法所示。


展开阅读全文

没有更多推荐了,返回首页