请看一下代码:
struct Human {
name: String,
profession: Profession,
}
enum Profession {
Doctor,
Teacher
}
struct Family {
family_doctor: // How to express type that will mean Human (because name matters) of profession Doctor?
}
Run Code Online (Sandbox Code Playgroud)
是否可以通过以Human某种方式进行泛型并将变体作为字段Doctor的类型参数传递来做到这一点?profession如果没有,那么您建议的这种关系最接近的解决方法是什么?
请注意,这个问题可能看起来与旧问题重复。但首先,Rust 不断发展,其次,我要求一种解决方法。
我通读了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 D {
A(i64),
B(u64),
C(u64, u64),
}
Run Code Online (Sandbox Code Playgroud)
let a = D.A(10);
println!(a.is_of(D.A)); // true
println!(a.is_of(D.B)); // false
Run Code Online (Sandbox Code Playgroud)
我知道我可以为此使用匹配规则,但是is_of出于我的目的,我希望此方法作为枚举选项的输入。
我发现自己经常定义enum如下类型:
struct Foo { }
struct Bar { }
struct Baz { }
enum MyEnum {
Foo(Foo),
Bar(Bar),
Baz(Baz),
}
Run Code Online (Sandbox Code Playgroud)
我发现重复的内容Foo(Foo)不雅且多余。它还使初始化变得多余:
let example = MyEnum::Foo(Foo{ /* ... */ });
Run Code Online (Sandbox Code Playgroud)
我想编写类似以下伪代码的内容:
struct Foo { }
struct Bar { }
struct Baz { }
type_enum MyEnum {
Foo,
Bar,
Baz,
}
let example = MyEnum::Foo{ /* ...anything that `Foo` supports ... */ };
Run Code Online (Sandbox Code Playgroud)
std::variant上面的内容与C++17 中的非常相似。Rust 支持类似的东西吗?