我有一个具有以下结构的枚举:
enum Expression {
Add(Add),
Mul(Mul),
Var(Var),
Coeff(Coeff)
}
Run Code Online (Sandbox Code Playgroud)
每个变体的"成员"都是结构.
现在我想比较两个枚举是否有相同的变体.所以,如果我有
let a = Expression::Add({something});
let b = Expression::Add({somethingelse});
Run Code Online (Sandbox Code Playgroud)
cmpvariant(a, b)应该是true.我可以想象一个简单的双重match代码,它遍历两个枚举实例的所有选项.但是,如果它存在,我正在寻找一个更好的解决方案.如果没有,双重匹配会有开销吗?我想在内部我只是比较两个整数(理想情况下).
我通读了trait文档,发现了在结构上使用trait的简洁定义。是否可以在enum类型上使用特征?我已经看到回答说“不”的答案,但是他们已经3岁了,还没有完全按照我的意愿去做。
我试图这样做:
#[derive(Debug, Copy, Clone)]
pub enum SceneType {
Cutscene,
Game,
Menu,
Pause,
Credits,
Exit,
}
//We want to guarantee every SceneType can be played statically
trait Playable {
fn play();
}
impl Playable for SceneType::Cutscene {
fn play() {}
}
Run Code Online (Sandbox Code Playgroud)
#[derive(Debug, Copy, Clone)]
pub enum SceneType {
Cutscene,
Game,
Menu,
Pause,
Credits,
Exit,
}
//We want to guarantee every SceneType can be played statically
trait Playable {
fn play();
}
impl Playable for SceneType::Cutscene { …Run Code Online (Sandbox Code Playgroud) 考虑以下(非法)示例:
enum Foo {
Bar { i: i32 },
Baz,
}
struct MyStruct {
field: Foo::Bar,
}
Run Code Online (Sandbox Code Playgroud)
Foo::Bar是一个类似结构的变体.我发现它们非常有用.但是,我有一个实例,我需要在另一个结构中存储结构的实例,如上面的示例MyStruct.改变MyStruct::field是一个Foo将是无效的,因为它没有为外地意义是一个Foo::Baz.它只是一个实例Foo::Bar.
rustc 告诉我上面的代码无效:
error: found value name used as a type: DefVariant(DefId { krate: 0u32, node: 4u32 }, DefId { krate: 0u32, node: 5u32 }, true)
Run Code Online (Sandbox Code Playgroud)
我只是做错了什么,或者这是不可能的?如果不可能,有没有计划呢?
我知道我可以像这样解决它,但我认为它是一个劣等选项,如果可能的话,我想避免它:
struct Bar {
i: i32,
}
enum Foo {
Bar(Bar),
Baz,
}
struct MyStruct {
field: Bar,
}
Run Code Online (Sandbox Code Playgroud) 我正在使用一个用于多态的枚举,类似于以下内容:
enum MyType {
Variant1 { a: i32, b: i32 },
Variant2 { a: bool, b: bool },
}
Run Code Online (Sandbox Code Playgroud)
是否有干净的方法将现有结构用于Variant1和Variant2?我已经完成以下工作:
struct Variant1 {
a: i32,
b: i32,
}
struct Variant2 {
a: bool,
b: bool,
}
enum MyType {
Variant1(Variant1),
Variant2(Variant2),
}
Run Code Online (Sandbox Code Playgroud)
但是感觉很笨重。我想知道是否有更好的方法来完成类似的事情。
我想检查测试中具有字段的枚举,而现在暂时忽略字段的实际值。
考虑以下示例:
enum MyEnum {
WithoutFields,
WithFields { field: String },
}
fn return_with_fields() -> MyEnum {
MyEnum::WithFields {
field: "some string".into(),
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn example() {
assert_eq!(return_with_fields(), MyEnum::WithFields {..});
}
}
Run Code Online (Sandbox Code Playgroud)
我想assert_eq!在这里使用,但是编译器告诉我:
enum MyEnum {
WithoutFields,
WithFields { field: String },
}
fn return_with_fields() -> MyEnum {
MyEnum::WithFields {
field: "some string".into(),
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn example() {
assert_eq!(return_with_fields(), MyEnum::WithFields {..});
}
} …Run Code Online (Sandbox Code Playgroud)