例如,考虑以下内容:
我可能只是缺少让这个工作所需的具体语法,但我无论如何都想不出来......
#[deriving(Eq, Show)]
struct EventOne {
x: f64,
y: f64
}
#[deriving(Eq, Show)]
struct EventTwo {
x: int,
y: int
}
#[deriving(Eq, Show)]
enum ComplexEvent {
A(EventOne, ~str),
B(EventTwo, ~str)
}
我这里有一个复杂的枚举类型 ComplexEvent,它可以是 A 或者 B。
我希望能够做到以下操作:
let x = A(EventOne { x: 0.1, y: 0.1}, ~"Hello");
let z = x.EventOne;
...但这会导致错误:
error: attempted access of field `EventOne` on type `union::ComplexEvent`, but no field with that name was found
let z = x.EventOne;
嗯...好的,作为一个数组?
error: cannot index a value of type `union::ComplexEvent`
let z = x[0];
好的,为了保证类型安全,您可能需要使用match来实现这个功能?
match x {
A(_, _) => ???,
B(_, _) => ???
}
...
union.rs:28:3: 31:4 error: mismatched types: expected `()` but found `std::result::Result<(),std::io::IoError>` (expected () but found enum std::result::Result)
union.rs:28 match x {
union.rs:29 A(_, _) => ???,
union.rs:30 B(_, _) => ???
union.rs:31 }
error: aborting due to previous error
我可能只是缺少让这个工作所需的具体语法,但我无论如何都想不出来......
编辑:从示例中删除 => 操作,因为它似乎让每个人都感到困惑。看问题啊!我想要从已经存在的枚举类型中获取一个子值,而不是匹配(match())枚举类型并执行println!
x
变量名更改为z
,这样就不会被同名的内部变量隐藏,以使事情更加清晰明了。 - oblitumx
不应该在匹配分支内使用,所以将其保留不变是安全的。 - Vladimir Matveev