Cairo 101 入门

1. Hello Cairo
2. 基本类型
3. 局部和状态变量
4. 变量可变性
5. 函数
6. 元组 Tuple
7. 数组
8. 结构体
9. 枚举
10. 映射和其他类型
11. 控制流
12. 模式匹配
13. Option
14. 类型转换
15. 构造函数
8. 结构体
结构体

在本章中,我们将介绍Cairo中的struct(结构体)。

结构体

结构体是一种自定义类型,它允许您将多个相关值组合成一个有意义的组,并为其分配一个名称。

Storage struct

在第三章中,我们使用了一个特殊的结构体 Storage 来声明存储变量:

// 使用结构体声明存储变量
#[storage]
struct Storage{
    var_felt: felt252,
    var_bool: bool,
    var_uint: u8,
}

自定义结构体

我们可以在您的合约中使用struct关键字定义自定义struct。下面我们定义了一个Student结构体:

// 创建自定义结构体
#[derive(Copy, Drop, Serde)] // 暂时忽略此行
struct Student {
    name: felt252,
    score: u128,
}

#[derive(Copy, Drop, Serde)] 是一个宏,它为struct添加更多功能。我们需要Copy和Drop宏以自动生成用于复制和删除结构体实例的代码(在函数中操作它们),以及Serde宏将结构体用作函数的返回类型。

创建结构体

您可以使用以下语法在函数中创建struct:

// 创建结构体
let student = Student{ name: '0xAA', score: 100_u128 };
// 或者
// let student: Student = Student{ name: '0xAA', score: 100_u128 };

读取值

您可以使用点表示法从struct中读取特定值:

// 从结构体中获取值
let student_name = student.name;
let student_score = student.score;

结构体数组

struct可以用作数组中的元素。

// 创建 Student 结构体的数组
let mut student_arr = ArrayTrait::<Student>::new();
student_arr.append(student);

结构体作为返回类型

您可以将struct用作函数的返回类型。为此,您需要Serde宏。Serde代表序列化和反序列化数据结构。

// 创建并返回一个 Student 结构体
#[external(v0)]
fn create_struct(self: @ContractState) -> Student{
    // 创建结构体
    let student = Student{ name: '0xAA', score: 100_u128 };
    return student;
}

总结

在本章中,我们介绍了Cairo中的结构体,包括如何定义、创建、从中读取值以及将它们作为函数的返回类型。

PreviousNext