Solidity中的變量類型
數值類型 Value Type
此類變量指派時直接傳遞數值:布爾型、整數型……
引用類型 Reference Type
此類變量占空間大,指派時直接傳遞位址(類似指針):數組array、結構體struct
映射類型 Mapping Type
solidity中的哈希表
函數類型 Function Type
solidity文檔中将函數類型歸為數值類型(課程作者認為其差别較大故單獨分類)
數組 array
定義:
用來存儲一組資料(整數、位元組、位址等等)
分為:
- 固定長度數組:在聲明時指定數組的長度,用**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;
建立數組的規則
- 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;
數組成員
- length:包含元素數量:數組有length,memory數組的長度在建立後固定
- push () :動态數組和bytes有push(),可以在數組最後添加一個0元素
- push(x):動态數組和bytes有push(x),可以在數組最後添加一個x元素
- pop () :動态數組和bytes有pop(),可以移除數組最後一個元素
結構體 struct
- 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;
}