【发布时间】:2019-08-09 22:32:59
【问题描述】:
考虑这样的枚举定义:
enum Money {
USD(u32),
EUR(u32),
CHF(u32),
// many more...
}
请注意,所有枚举变体的类型均为 u32。
fn amount(money: Money) -> u32 {
// ?
}
我是否可以在不匹配所有情况的情况下一般提取 Money 实例中包含的包装 u32,如果可以,如何?
【问题讨论】:
-
如果这是您的类型的属性,您可以考虑重新设计它:将
enum Currency { Usd, Eur, Chf, ...}与struct Money { currency: Currency, quantity: u32 }结合起来 -
这个用例的中心是一个糟糕的数据建模。当然这是一个示例,但重要的原因是,如果您的数据被正确建模,您不会经常(从不?)需要这样的访问器。
-
你可以做
unsafe {(std::mem::transmute_copy::<Money, u64>(self)>>32) as u32}。告诉别人你在哪里找到的。 -
我相信在这里使用
transmute_copy会调用未定义的行为,因为枚举的布局是未定义的。如果不出意外,它假定判别式出现在值之前,这是无法保证的。我强烈建议不要使用它。 -
如果仍有疑问:
unsafe技巧可以被视为一个笑话或作为枚举编码方式的演示,但 不是 作为正确的 sn -p 你应该粘贴到你的代码中。