2017-08-03 72 views
0

锈病documentation gives this example我们在那里的Result<T, E>实例名为some_value没有模式匹配

match some_value { 
    Ok(value) => println!("got a value: {}", value), 
    Err(_) => println!("an error occurred"), 
} 

有没有办法从some_value没有模式匹配读?甚至没有在运行时检查内容的类型呢?也许我们绝对肯定地知道包含什么类型,或许我们只是一个糟糕的程序员。无论哪种情况,我只是想知道它是否可能,而不是它是否是一个好主意。

它让我觉得这是一个非常有趣的语言功能,这个分支很难(或不可能?)避免。

+1

相关/可能重复:https://stackoverflow.com/questions/34953711/unwrap-inner-type-when-enum-variant-is-known –

回答

7

在最低水平,不,你不能没有match 阅读枚举领域。

enum上的方法可以更方便地访问枚举中的数据(例如Result::unwrap),但在引擎盖下时,它们总是以match实现。

如果您知道在match特定的情况下是无法访问的,通常的做法是写在那个分支unreachable!()unreachable!()简单地扩展到panic!()与特定的消息)。


如果你只有一个变型的枚举,你也可以写一个简单的let声明解构枚举。 let语句中的模式必须是详尽的,并且与枚举中的单个变体匹配的模式是详尽无遗的。但是只有一个变体的枚举几乎从未使用;一个结构可以很好地完成这项工作。如果您打算稍后添加变体,则最好马上写一个match

enum Single { 
    S(i32), 
} 

fn main() { 
    let a = Single::S(1); 
    let Single::S(b) = a; 
    println!("{}", b); 
} 

在另一方面,如果你有一个以上变异的枚举,你也可以使用if letwhile let如果你只从单一的变异体感兴趣的数据。虽然let需要详尽的模式,但if letwhile let需要非穷举模式。你会经常看到他们使用Option

fn main() { 
    if let Some(x) = std::env::args().len().checked_add(1) { 
     println!("{}", x); 
    } else { 
     println!("too many args :("); 
    } 
} 
+0

也值得一提的是['if let'](https://rustbyexample.com/flow_control/if_let.html)语法 – user25064

+0

@ user25064好点!更新。 –