Solidity語言學習筆記————15、結構體Struct

FLy_鵬程萬里發表於2018-06-21

自定義結構體

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()方法所示。


相關文章