Cairo 101 入门

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

在本章中,我们将介绍如何利用 Cairo 中的 match 关键字进行模式匹配。它提供了一种强大且安全的机制来处理 enum 不同的值。

match 表达式

Cairo 中的 match 属于控制流运算符,它允许你以清晰、简洁的方式处理枚举的不同可能值。它类似于其他语言中的 switch 语句,但表达能力更强,也更安全。

match 表达式由多个分支组成,每个分支包含一个模式和一个代码块,当给定的值符合该分支的模式时,就会执行该代码块。

以下是一个简单的 match 表达式的例子:

#[derive(Drop, Serde)]
enum Colors { 
    Red: (), 
    Green: (), 
    Blue: (), 
    }  

// return red color
#[external(v0)]
fn get_red(self: @ContractState) -> Colors {
    Colors::Red(())
}

// match pattern (Colors)
#[external(v0)]
fn match_color(self: @ContractState, color: Colors) -> u8 {
    match color {
        Colors::Red(()) => 1_u8,
        Colors::Green(()) => 2_u8,
        Colors::Blue(()) => 3_u8,
    }
}

// match color example, should return 1_u8
#[external(v0)]
fn match_red(self: @ContractState, ) -> u8 {
    let color = get_red(self);
    match_color(self, color)
}

此例中使用了 match 表达式来处理不同的 Colors 枚举变量。match 表达式会根据 color 的变体来执行相应的代码。

规则

  1. match 表达式中的每个分支都包括一个模式和其关联的代码,二者由 => 运算符分隔。
  2. match 是穷尽的,你必须考虑到所有 enum 所有可能的值。
  3. match 分支的顺序必须与 enum 的顺序相同。
  4. 如果一个分支的代码有多行,应使用 {} 来包裹这个分支的代码。

模式绑定

在 Cairo 中,模式绑定允许你解构与你的数据相关的数据类型,如枚举或结构体,并将他们的内部值绑定到变量。这在 match 表达式中特别有用,因为可以在不同模式下的代码块中使用其内部值。

#[derive(Drop, Serde)]
enum Actions { 
    Forward: u128, 
    Stop: (),
}

// return forward action
#[external(v0)]
fn get_forward(self: @ContractState, dist: u128) -> Actions {
    Actions::Forward(dist)
}

// match pattern with data (Actions)
#[external(v0)]
fn match_action(self: @ContractState, action: Actions) -> u128 {
    match action {
        Actions::Forward(dist) => {
            dist
        },
        Actions::Stop(_) => {
            0_u128
        }
    }
}

// match action example, should return 2_u128
#[external(v0)]
fn match_forward(self: @ContractState) -> u128 {
    let action = get_forward(self, 2_u128);
    match_action(self, action)
}

在这个例子中,dist 绑定了 Actions 枚举的 Forward 变体中的值:当 action 匹配 Actions::Forward(dist) 时,变量 dist 被赋予 Forward 变体内部的值,可以在匹配分支的代码块时中使用。此外,下划线 _ 充当一个占位符,可以匹配任何值,但不将值绑定到变量。

总结

在这一章中,我们介绍了如何使用 match 关键字进行模式匹配,包括 match 表达式的穷尽性以及模式绑定的实用性,后者可以分解复杂的数据类型,将它们的内部部分绑定到变量,提高代码的可读性和效率。

PreviousNext