StarknetAstro

StarknetAstro

05_Cairo中的Enum(枚舉)

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();
            },
        }
    }
}

這樣給數據類型帶來了極大的豐富性。

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。