当一个人已经知道某些需要动态多态性的代码中涉及的所有有限数量的类型时,enum
与 using 相比, using 可以更好地提高性能,Box
因为后者使用动态内存分配,并且您需要使用具有虚函数调用的 trait 对象作为出色地。
也就是说,与使用std::variant
and的 C++ 中的等效代码相比,std::visit
在这种情况下,Rust 似乎涉及更多样板代码,至少对我来说是这样(我还没有学会使用过程宏)。在这里举个例子:我有很多struct
类型:
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
is 本身是一个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
astd::variant
并且它是一个单行。如果不手动为特征 X 中的每个变体中的每个函数编写所有模式匹配,我该如何做同样的事情enum
?