< 返回版块

kcrazy 发表于 2021-09-16 16:47

请问

pub enum Symbol {
    BraceL { a: i32 },
    BraceR { b: u32 },
}

比如有上面枚举类型 Symbol,我想表示 Symbol::BraceL 这个类型,并想用类型作为函数参数,但又不想这样

Symbol::BraceL { a: 1 }.type_id()

因为我还没有拿到一个对象,也不想再定义一个新枚举

pub enum SymbolType {
    BraceL,
    BraceR,
}

有什么好办法呢?

评论区

写评论
solarsail 2021-09-17 16:13

不确定这个是不是你想要的:std::mem::discriminant

johnmave126 2021-09-17 10:52

首先,目前枚举的所有实例共享type_id,也就是说对于类型系统来说无论具体是哪个枚举,BraceLBraceR的type_id都是一样的

其次既然是要传参,那么参数肯定有类型,这个类型又不是原枚举类型,所以肯定需要新类型,所以还是定义一个新枚举吧。

苦瓜小仔 2021-09-16 17:38

→ playground

fn main() {
    let sym = Symbol::BraceL { a: 0 };
    f(sym);
}

pub enum Symbol {
    BraceL { a: i32 },
    BraceR { b: u32 },
}

fn f(arg: Symbol) {
    use Symbol::*;
    match arg {
        BraceL { a } => println!("{}", a),
        BraceR { .. } => (),
    }
}
1 共 3 条评论, 1 页