天天看點

【solidity入門】5. 引用類型 Reference Type

Solidity中的變量類型

數值類型 Value Type

此類變量指派時直接傳遞數值:布爾型、整數型……

引用類型 Reference Type

此類變量占空間大,指派時直接傳遞位址(類似指針):數組array、結構體struct

映射類型 Mapping Type

solidity中的哈希表

函數類型 Function Type

solidity文檔中将函數類型歸為數值類型(課程作者認為其差别較大故單獨分類)

數組 array

定義:

用來存儲一組資料(整數、位元組、位址等等)

分為:

  1. 固定長度數組:在聲明時指定數組的長度,用**T[K]**的格式聲明,T為元素類型,K為長度
// 固定長度Array
uint[8] array1;
bytes1[5] array2;
address[100] array3;
           

    2. 可變長度數組(動态數組):在聲明時不指定數組的長度,用T[ ]格式聲明,T為元素類型 (bytes比較特殊,是數組,但不用加[ ])

// 可變長度 Array
uint[] array4;
bytes1[] array5;
address[] array6;
bytes array7;
           

建立數組的規則

  1. memory修飾的動态數組:可用new操作符來建立,但必須聲明長度,且聲明後長度不能改變
// memory動态數組
uint[] memory array8 = new uint[](5);
bytes memory array9 = new bytes(9);
           

     2. 數組字面常數Array Literals:寫作表達式形式的數組,用方括号包着來初始化array的一種方式,且裡面每一個元素的type是以第一個元素為準

——如: [1,2,3]裡面所有的元素都是uint8類型,因為solidity中如果一個值沒有指定type的話,預設就是最小機關的該type,這裡int的預設最小機關類型就是uint8

——接上文: [unit (1),2,3]裡面的元素都是uint類型,因為第一個元素指定是uint類型,所有都以第一個元素為準

——下面的合約中:對于 f 函數裡面的調用,如果沒有顯示對第一個元素進行uint強行轉化的話,會報錯。因為如上所述,我們其實是轉入了uint8類型的array,可是 g 函數需要的卻是uint類型的array,就會報錯了

// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.4.16 <0.9.0;
contract C {
    function f() public pure {
        g([uint(1),2,3]);
    }
    function g(uint[3] memory) public pure {
    }
}
           

     3. 建立動态數組:需要一個一個元素的指派

uint【】 memory x = new uint[](3);
x[0] = 1;
x[1] = 3;
x[2] = 4;
           

數組成員

  1. length:包含元素數量:數組有length,memory數組的長度在建立後固定
  2. push () :動态數組和bytes有push(),可以在數組最後添加一個0元素
  3. push(x):動态數組和bytes有push(x),可以在數組最後添加一個x元素
  4. pop () :動态數組和bytes有pop(),可以移除數組最後一個元素

結構體 struct

  1. solidity支援通過構造結構體的形式定義新的類型
// 建立結構體
struct Student{
    uint256 id;
    uint256 score;
}
           
Student student; //初始一個student結構體
           

    2. 給結構體指派的兩種方法

// 給結構體指派
// **方法1:在函數中建立一個storage的struct引用**
function initStudent1() external{
    Student storage _student = student; // assign a copy of student
    _student.id = 11;
    _student.score = 100;
}
           
// **方法2:直接引用狀态變量struct**
function initStudent2() external{
    student.id = 1;
    student.score = 80;
}
           

繼續閱讀