WTF Cairo极简教程: 8. 结构体
我最近在学cairo-lang,巩固一下细节,也写一个WTF Cairo极简教程,供小白们使用。教程基于cairo 2.2.0版本。
WTF Academy 社群:Discord|微信群|官网 wtf.academy
所有代码和教程开源在 github: github.com/WTFAcademy/WTF-Cairo
在本章中,我们将介绍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中的结构体,包括如何定义、创建、从中读取值以及将它们作为函数的返回类型。