08_Cairo 中の Match 制御モード#
この記事で使用されている Cairo コンパイラのバージョン:2.0.0-rc0。Cairo は現在急速に更新されているため、異なるバージョンの構文が若干異なる場合がありますが、将来的には安定したバージョンに記事の内容を更新する予定です。
Cairo の Match 制御モードは、Rust のそれと 90% 同じです。Cairo はまだ開発中であり、多くの機能が未完成ですが、Rust は比較的安定しているため、この機能を学ぶ際にRust の Match 制御モードを参考にすることができます。
基本的な使い方#
マッチするコードブロックが比較的短い場合は、中括弧を使用せずにコンマで区切ることができます。長い場合は、中括弧を使用する必要があります。
上記のコードでは、value_in_cents
のパラメータの型は Coin であり、Coin のサブタイプの変数もvalue_in_cents
の引数として使用することができます。以前に説明したように、Enum はサブタイプの集合として理解することができ、すべてのサブタイプは親タイプを表すことができます。したがって、どのサブタイプの変数でも、value_in_cents
関数の引数として使用することができます。
中括弧を使用する場合:
Rust との違い#
(1). Enum の定義時の違い
- Enum 要素の型を指定する方法が異なり、Cairo ではコロンを追加する必要があります
Penny:(u8)
、Rust ではコロンは必要ありませんPenny(u8)
- Enum 要素の型を指定しない場合、Cairo では括弧を省略することはできません
Penny:()
、Rust では直接省略することができます
(2). Match の条件の違い
- 型が指定されていない Enum 要素は、
(_)
を使用して明示する必要がありますが、Rust では必要ありません
(3). パラメータの渡し方の違い
- 型が指定されていない Enum 要素は、パラメータを渡す際には標準の型を渡す必要があります。例:
let n = Coin::Nickel(());
Enum の定義時 | Match の条件 | パラメータの渡し方 | |
---|---|---|---|
Rust | Penny(u8) | Coin::Penny | Coin::Penny() |
Cairo | Penny:(u8) | Coin::Penny(_) | Coin::Penny(()) |
パラメータのバインド#
Enum には型を追加することができ、Match の各マッチング項目は Enum にバインドされた型をマッチング項目のパラメータとして使用することができます。
上記のコードでは、UsState::Alabama は Coin::Quarter (state) のパラメータ state として使用されています。
Rust との違い#
Cairo では Enum はデフォルトで PrintTrait が実装されていないため、UsState に impl を追加して Print 機能を実装する必要があります。
Match パターンと Option の組み合わせ#
Match パターンと Option を組み合わせると、非 null チェックを実現することができます。
次のようなロジックを含む関数を実装してみましょう:パラメータが null でない場合は + 1 し、null の場合は何もしない。
plus_one
関数はこの機能を実現し、関数内で null の場合のロジック処理を追加することもできます。また、返り値を使用して null かどうかを判断し、それに応じて null の場合の処理を行うこともできます。
Match パターンのルール#
最初のルール:Match はすべての可能性を網羅する必要があります。
上記のコードでは、None の場合の処理がされていないため、コンパイルエラーが発生します。
2 番目のルール:Cairo には現在非常にシンプルなデフォルト効果しかありません。