当人们已经知道某些需要动态多态性的代码中涉及的所有有限数量的类型时,使用enum
与使用相比,可以更好地提高性能Box
因为后者使用动态内存分配,并且您需要使用也具有虚拟函数调用的特征对象。
也就是说,与 C++ 中使用的等效代码相比std::variant
and std::visit
,看起来这个场景中的 Rust 涉及更多样板代码,至少对我来说是这样(我还没有学会使用过程宏)。在这里举个例子:我有很多struct
types:
struct A {
// ...
}
struct B {
// ...
}
// ...
struct Z {
// ...
}
他们都实现了特质AlphabetLetter
这是:
trait AlphabetLetter {
fn some_function(&self);
}
由于涉及的类型集是已知且有限的,我想使用enum
:
enum Letter {
AVariant(A),
BVariant(B),
// ...
ZVariant(Z),
}
这里我们已经有了第一个样板:我需要添加一个名称enum
涉及的每个类型变体的值。但真正的问题是:enum
Letter
本身就是一个AlphabetLetter
,它只是代表了这样一个事实:我们在运行时不知道它是哪个字母。所以我开始为它实现这个特质:
impl AlphabetLetter for Letter {
fn some_function(&self) {
match self {
Letter::AVariant(letter) => letter.some_function();
Letter::BVariant(letter) => letter.some_function();
// ...
Letter::ZVariant(letter) => letter.some_function();
}
}
}
是的,这可以很容易地变成很多代码,但我发现没有其他方法可以做到这一点。在 C++ 中,多亏了泛型 lambda,人们可以std::visit
a std::variant
这是单行船。我怎样才能做到同样的事情,而不需要手动为特征 X 中的每个变体中的每个函数编写所有模式匹配enum
?