相关疑难解决方法(0)

仅按变体比较枚举,而不是值

我有一个具有以下结构的枚举:

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代码,它遍历两个枚举实例的所有选项.但是,如果它存在,我正在寻找一个更好的解决方案.如果没有,双重匹配会有开销吗?我想在内部我只是比较两个整数(理想情况下).

rust

20
推荐指数
1
解决办法
4454
查看次数

可以在枚举类型上使用特征吗?

我通读了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)

enums traits rust

6
推荐指数
2
解决办法
3122
查看次数

类似结构的枚举可以用作类型吗?

考虑以下(非法)示例:

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)

enums rust

4
推荐指数
2
解决办法
873
查看次数

有没有办法将现有结构用作枚举变量?

我正在使用一个用于多态的枚举,类似于以下内容:

enum MyType {
    Variant1 { a: i32, b: i32 },
    Variant2 { a: bool, b: bool },
}
Run Code Online (Sandbox Code Playgroud)

是否有干净的方法将现有结构用于Variant1Variant2?我已经完成以下工作:

struct Variant1 {
    a: i32,
    b: i32,
}

struct Variant2 {
    a: bool,
    b: bool,
}

enum MyType {
    Variant1(Variant1),
    Variant2(Variant2),
}
Run Code Online (Sandbox Code Playgroud)

但是感觉很笨重。我想知道是否有更好的方法来完成类似的事情。

rust

4
推荐指数
1
解决办法
488
查看次数

如果我不在乎枚举字段,如何断言枚举是特定变量?

我想检查测试中具有字段的枚举,而现在暂时忽略字段的实际值。

考虑以下示例:

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)

rust

4
推荐指数
2
解决办法
2033
查看次数

标签 统计

rust ×5

enums ×2

traits ×1