複合型別的資料包括:array(陣列)、struct(結構體)和mapping(對映),其中array和struct也稱為引用型別。
複合型別
陣列(array)
陣列(array)是一種用於儲存相同型別元素的集合,分為固定長度的靜態陣列和長度可變的動態陣列。需要注意的是,陣列中的元素型別不能是對映型別(mapping),因為對映型別本身就是一種複雜的資料結構,無法直接儲存在陣列中。
uint[5] array1; //宣告瞭一個長度為5的靜態陣列,用於儲存無符號整數型別的資料
uint[] array2; //宣告瞭一個動態陣列,它可以更具需要在執行是調整大小
賦值:
為靜態陣列賦值可以直接賦值也可以逐個賦值:
直接賦值:在合約的建構函式中,直接使用靜態陣列的初始化列表來初始化陣列元素。
逐個賦值:使用索引運運算元'[]',給靜態陣列的不同位置賦值。
uint[3] public Array; //宣告一個長度為3的靜態陣列Array
//直接賦值
constructor(){
Array = [1, 2, 3]; //在建構函式中直接初始化陣列
}
//逐個賦值
function assign(uint value1, uint value2, uint value3) public{
Array[0] = value1;
Array[1] = value2;
Array[2] = value3; //逐個給陣列的每個位置賦值
}
為動態陣列賦值的方式也有多種:
使用'.push()'方法逐個賦值:使用'.push()'方法將元素逐個新增進陣列的末尾。
整體賦值:將一整個陣列直接賦值給目標陣列。
索引賦值:使用索引運運算元'[]'來為索引的元素賦值。
uint[] public Array; //宣告一個動態陣列
//'.push()'方法賦值
function add(uint value) public{
Array.push(value); //使用',push()'方法在陣列末尾新增元素
}
//整體賦值
function addArray(uint[] memory values) public{
Array = values; //將整個陣列賦值給目標陣列
}
//索引賦值
function assign(uint index, uint _value) public{
Array[index] = _value; //對陣列的某個位置賦值
}
陣列方法:
'.push()'方法:'.push(_value)'用於在動態陣列的末尾新增一個元素,'.push()'可在動態陣列末尾新增'0'元素。
'.pop()'方法:'.pop()'用於刪除動態陣列的末尾元素。
'.length'方法:'.length'方法用於返回陣列的當前長度。
其中'.push()'方法和'.pop()'方法只能用於動態陣列。
特殊:bytes也是陣列,是一種動態長度的位元組陣列,類似於動態陣列,可以儲存任意長度的位元組資料,使用時不用加索引符'[]'。
bytes public Bytes; //宣告一個'bytes'型別的變數
function setBytes(bytes memory data) public{
Bytes = data; //透過'setBytes'函式為'Bytes'賦值
}
結構體(struct)
solidity中的結構體(struct)類似於C/C++中的結構體,允許將多個不同資料型別的成員組合在一起以表示一個實體。
//定義一個名為Student的結構體
struct Student{
string stuName; //字串成員,表示學生姓名
uint stuId; //無符號整型成員,表示學生學號
}
Student public student; //宣告一個Student型別的變數
賦值:
為結構體成員賦值同樣有多種方式:
直接賦值:直接為結構體成員進行賦值。
建構函式賦值:如果結構體包含在合約中,可以用建構函式對結構體進行賦值。
傳參賦值:將結構體作為函式引數傳遞,在函式內進行賦值。
//用上述Student結構體進行示例
//直接賦值
Student memory student1;
student1.stuName = "Tom";
student1.stuId = 111111;
Student memory student2 = Student("Jack", 222222);//也可按結構體成員一次賦值
//建構函式賦值
constructor(string memory name, uint id){
student = Student(name, id);
}
//傳參賦值
function setStudent(string memory name, uint id) public{
student = Student(name, id);
}