Solidity-变量和数据类型[复合类型_1]

发布时间 2023-09-08 19:37:30作者: 我不是黑帽子

复合类型的数据包括: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);
}