05_Cairo 中的 Enum (枚舉)#
此文章使用的 Cairo 編譯器版本:2.0.0-rc0。因為 Cairo 正在快速更新,所以不同版本的語法會有些許不同,未來將會將文章內容更新到穩定版本。
Cairo 中的枚舉是一組類型的枚舉,或者可以說是多個子類型公用一個枚舉類型。適用的場景是:一組有著共同點的類型,但是每個類型又有許多不同,而且同一時刻相互之間互斥。
基本使用介紹#
比如:IP 有兩個版本,IPV6 & IPV4。這兩個版本同樣是 IP 的版本號,並且同一個值只會是其中一種類型,那麼這時候就可以使用枚舉。定義方式如下。
enum IpAddrKind {
V4:(),
V6:(),
}
使用 Enum 實例化變量
let four = IpAddrKind::V4(());
let six = IpAddrKind::V6(());
V4 和 V6 在函數傳參的時候,都可以算作一個類型 IpAddrKind。
#[derive(Drop)]
enum IpAddrKind {
V4: (),
V6: (),
}
fn route(ip_kind: IpAddrKind) {}
fn main() {
route(IpAddrKind::V4(()));
route(IpAddrKind::V6(()));
}
在枚舉中添加類型#
和 Rust 一樣,我們可以將各種類型都添加到枚舉中,枚舉中的每個元素就像是類型的別名。
#[derive(Drop)]
enum Message {
Quit: (),
Echo: felt252,
Move: (usize, usize),
ChangeColor: (u8, u8, u8)
}
fn route(msg: Message) {}
fn main() {
route(Message::Quit(()));
route(Message::Echo(20));
route(Message::Move((32_usize, 32_usize)));
route(Message::ChangeColor((8_u8, 8_u8, 8_u8)));
}
上面將 felt252、tuple 添加到了 Message 這個 enum 中,並且將對應類型的變量作為 route 的參數。
給 enum 添加 impl#
我們可以給struct添加 impl,定義 funcitons,同樣也可以使用在 enum 上。代碼案例如下:
use debug::PrintTrait;
#[derive(Drop)]
enum Message {
Quit: (),
Echo: felt252,
Move: (usize, usize),
ChangeColor: (u8, u8, u8)
}
trait Processing {
fn process(self: Message);
}
impl ProcessingImpl of Processing {
fn process(self: Message) {
match self {
Message::Quit(()) => {
'quitting'.print();
},
Message::Echo(value) => {
value.print();
},
Message::Move((x, y)) => {
'moving'.print();
},
Message::ChangeColor((x, y, z)) => {
'ChangeColor'.print();
},
}
}
}
這樣給數據類型帶來了極大的豐富性。