例如,考虑:
#[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!
很简单:
let x = A(EventOne { x: 0.1, y: 0.1 }, ~"Hello");
match x {
A(EventOne{x, y}, s) => println!("{}, {}, {}", x, y, s),
B(EventTwo{x, y}, s) => println!("{}, {}, {}", x, y, s)
}
请注意,这样的匹配意味着您要移出~str
字段,因为它不是隐式可复制的,因此x
成为部分移动的值,您将无法进一步使用它。如果确实要在匹配后使用该值,则可以s
通过引用进行绑定:
let x = B(EventTwo { x: 1, y: 2 }, ~"World");
match x {
A(EventOne{x, y}, ref s) => println!("{}, {}, {}", x, y, *s),
B(EventTwo{x, y}, ref s) => println!("{}, {}, {}", x, y, *s)
}
在这种情况下,s
它的类型为&~str
,因此您必须取消引用它才能打印它。x
之后,您将可以使用,因为您没有将~str
字段移出,并且另一个字段是隐式可复制的,因为它由隐式可复制的数据组成。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句