Rust -枚举方法,调用内部值的方法



我有一个像这样的enum:

enum Foo {
A(X),
B(Y),
C(Z),
}

其中X, Y和Z是实现方法bar()的结构体

我希望能够在Foo枚举上定义一个方法bar,以便它调用其内部值的相应方法。现在我有这个:

impl Foo {
pub fn bar() {
match self {
Foo::A(f) => { f.bar(); }
Foo::B(f) => { f.bar(); }
Foo::C(f) => { f.bar(); }
}
}
}
如果可能的话,如何使用enum做得更好呢?

可以使用trait对象代替enum:

trait Bar { fn bar(&self); }
struct X;
impl Bar for X { fn bar(&self) {} }

struct Y;
impl Bar for Y { fn bar(&self) {} }

struct Z;
impl Bar for Z { fn bar(&self) {} }
let mut x: Box<dyn Bar> = Box::new(X /* or Y or Z */);
x.bar();

然而,这伴随着Boxdyn动态调度的开销。您拥有的代码是更好的解决方案。如果您愿意,可以使用enum_dispatchcrate来删除一些样板文件:

#[enum_dispatch]
trait Bar { fn bar(&self); }
#[enum_dispatch(Bar)]
enum Foo {
A(X),
B(Y),
C(Z),
}
let foo = Foo::A(X);
foo.bar();

相关内容

  • 没有找到相关文章

最新更新