我有一些特徵是由某些結構實現的。我想寫一個模式匹配,我可以處理每一種可能的情況:如何匹配性狀實現者
trait Base {}
struct Foo { x: uint }
struct Bar { y: uint }
impl Base for Foo {}
impl Base for Bar {}
fn test(v: bool) -> Box<Base + 'static> {
// Let's pretend there's real logic that determines what to return.
if v {
box Foo { x: 5 }
} else {
box Bar { y: 10 }
}
}
fn main() {
let f: Box<Base> = test(true);
// Now that we have a `Box<Base>` (`*f` makes it a `Base`),
// let's handle different cases:
match *f {
Foo { x } => println!("it was Foo: {}!", x),
Bar { y } => println!("it was Bar: {}!", y),
}
}
(在線試用:http://is.gd/YuBkPF)
我得到這個編譯錯誤:
mismatched types: expected
Base
, found a structure pattern
我能用枚舉的命名結構領域?我真正的結構包含許多帶有名稱和幾種方法的字段。 – 2014-09-30 19:47:06
您可以將任意數據放入enum變體中。這可以工作,例如:'struct Foo {f:uint};枚舉FooBar {EFoo(Foo)}'。枚舉還支持其變體中的字段(稱爲結構變體):'enum FooBar {Foo {f:uint}}',儘管這個特性是門控的,這只是一個語法上的便利 - 結構變體不是結構體,不能方法,例如。 – 2014-09-30 19:49:30
好吧,Rust *具有*在運行時檢查類型的能力 - 它通過'Any'特性暴露。 'AnyRefExt'具有'is ::()'方法,它與'instanceof'基本相同。但是,Rust不贊成靜態類型檢查。編寫一個基於枚舉的匹配調度是安全的,因爲它可以保證處理所有可能的情況,並且可以進行靜態檢查。 –
2014-10-01 14:20:44