Solidity-變數和資料型別[複合型別_1]

我不是黑帽子發表於2023-09-08

複合型別的資料包括: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);
}

 

相關文章