Solidity基礎入門知識(八)結構體structs
阿新 • • 發佈:2019-02-05
自定義結構體
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()
方法所示。
(轉自:tryblockchain.org)