13.Option


文档摘要

title: 13. Option tags: cairo starknet option enum WTF Cairo极简教程: 13. Option 我最近在学 ,巩固一下细节,也写一个 ,供小白们使用。教程基于 版本。 推特:@0xAAScience|@WTFAcademy WTF Academy 社群:Discord|微信群|官网 wtf.academy 所有代码和教程开源在 github: github.com/WTFAcademy/WTF-Cairo 在本章中,我们将探讨 Cairo 中的 枚举。它编码了一个值可能存在或不存在的情况,比其他编程语言中的 值更安全。 枚举 Cairo 中的 枚举表示一个值可能存在或不存在。它的定义如下: 在最新版本(Cairo2.6.

title: 13. Option tags: - cairo - starknet - option - enum

WTF Cairo极简教程: 13. Option

我最近在学cairo-lang,巩固一下细节,也写一个WTF Cairo极简教程,供小白们使用。教程基于cairo 2.2.0版本。

推特:@0xAA_Science@WTFAcademy_

WTF Academy 社群:Discord微信群官网 wtf.academy

所有代码和教程开源在 github: github.com/WTFAcademy/WTF-Cairo

在本章中,我们将探讨 Cairo 中的 Option 枚举。它编码了一个值可能存在或不存在的情况,比其他编程语言中的 Null 值更安全。

Option 枚举

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 实例

构建 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 }

解包 Option

你可以使用 unwrap() 方法或expect()方法提取 OptionSome 变体中的值。对于 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

Option 枚举提供了两种方法来验证其内容是否为空:

  • is_some(): 如果 OptionSome 变体,则返回 true
  • is_none(): 如果 OptionNone 变体,则返回 true

在以下示例中,如果 optionSome,则函数返回所包含的值,否则返回 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 程序的安全性和鲁棒性。


作者与出处
原作者: WTFAcademy
来源:WTFAcademy
许可证:MIT
整理: 灏天文库整理
由灏天文库结构化整理,提供目录导航、全文检索与在线阅读,便于系统化学习
发布者: 作者: WTFAcademy 转发
评论区 (0)
U