title | tags | ||||
---|---|---|---|---|---|
13. Option |
|
我最近在学cairo-lang
,巩固一下细节,也写一个WTF Cairo极简教程
,供小白们使用。教程基于cairo 2.2.0
版本。
WTF Academy 社群:Discord|微信群|官网 wtf.academy
所有代码和教程开源在 github: github.com/WTFAcademy/WTF-Cairo
在本章中,我们将探讨 Cairo 中的 Option
枚举。它编码了一个值可能存在或不存在的情况,比其他编程语言中的 Null
值更安全。
Cairo 中的 Option
枚举表示一个值可能存在或不存在。它的定义如下:
enum Option<T> {
Some: T,
None: (),
}
在最新版本(Cairo2.6.0),可以直接使用,无需导入OptionTrait。
Option
枚举可以通过其 Some
变体容纳任何类型的值,或者通过其 None
变体表示值的缺失。
<T>
语法表示泛型类型,目前我们只需要了解 Option
枚举的 Some
变体可以容纳任何类型的单个数据。我们将在后续章节中介绍泛型的概念。需要注意的是,如果使用的是None,参数不可以为空,需要传入()
。
Option
允许我们利用 Cairo 强大的类型系统来防止空值或未定义值错误。与其允许变量为空,Cairo 更鼓励使用 Option
枚举来表示值的缺失,增加了 Cairo 的安全性。
Option
不能与其他类型的变量一起混用,例如进行加减运算等。
构建 Option
变量非常简单,类似于创建其他枚举:
// 创建 Some Option
fn create_some() -> Option<u8> {
let some_value: Option<u8> = Option::Some(1_u8);
some_value
}
// 创建 None Option
fn create_none() -> Option<u8> {
let none_value: Option<u8> = Option::None(());
none_value
}
你可以使用 unwrap()
方法或expect()
方法提取 Option
的 Some
变体中的值。对于 None
变体,它会抛出错误。
// 使用 unwrap() 从 Some 中获取值
#[external(v0)]
fn get_value_from_some(self: @ContractState) -> u8 {
let some_value = create_some();
some_value.unwrap()
}
#[external(v0)]
fn expect_value(self: @ContractState) -> u8 {
let some_value = create_some();
some_value.expect(0)
}
你也可以使用expect()
方法来判断是否为某个值,如果不是则会抛出错误。
Option
枚举提供了两种方法来验证其内容是否为空:
is_some()
: 如果Option
是Some
变体,则返回true
。is_none()
: 如果Option
是None
变体,则返回true
。
在以下示例中,如果 option
是 Some
,则函数返回所包含的值,否则返回 0
。
// 使用 is_some() 和 is_none() 处理选项
#[external(v0)]
fn handle_option_1(self: @ContractState, option: Option<u8>) -> u8 {
// is_some() Returns `true` if the `option` is `Option::Some`.
// is_none() Returns `true` if the `option` is `Option::None`.
if option.is_some() {
option.unwrap()
} else {
0_u8
}
}
或者,你可以使用 match
表达式处理 Option
。
// 使用 match 处理选项
#[external(v0)]
fn handle_option_2(self: @ContractState, option: Option<u8>) -> u8 {
match option{
Option::Some(value) => value,
Option::None(_) => 0_u8,
}
}
本章全面介绍了 Cairo 中的 Option
枚举。它用于编码值可能的存在或缺失,并增强 Cairo 程序的安全性和鲁棒性。