Pra*_*tic 2 enums discriminated-union rust
Rust 文档给出了这个示例,其中我们有一个Result<T, E>named 实例some_value:
match some_value {
Ok(value) => println!("got a value: {}", value),
Err(_) => println!("an error occurred"),
}
Run Code Online (Sandbox Code Playgroud)
有没有方法可以在some_value没有模式匹配的情况下阅读?甚至没有在运行时检查内容的类型怎么样?也许我们以某种方式绝对肯定地知道包含什么类型,或者我们可能只是一个糟糕的程序员.在任何一种情况下,我只是想知道它是否可能,而不是它是一个好主意.
它让我觉得这是一个非常有趣的语言特征,这个分支是如此困难(或不可能?)来避免.
Fra*_*gné 10
在最低级别,不,您不能在没有match1的情况下读取枚举字段.
枚举上的方法可以更方便地访问枚举中的数据(例如Result::unwrap),但是在引擎盖下,它们总是用a实现match.
如果您知道a中的特定案例match无法访问,则通常的做法是unreachable!()在该分支上写入(unreachable!()只需panic!()使用特定消息扩展为a ).
1如果你的枚举只有一个变体,你也可以编写一个简单的let语句来解构枚举.let语句中的模式必须是详尽的,并且与枚举中的单个变体匹配的模式是详尽的.但只有一种变体的枚举几乎从未使用过; 结构可以很好地完成工作.如果您打算稍后添加变体,最好match立刻写一下.
enum Single {
S(i32),
}
fn main() {
let a = Single::S(1);
let Single::S(b) = a;
println!("{}", b);
}
Run Code Online (Sandbox Code Playgroud)
另一方面,如果您有一个包含多个变体的枚举,您也可以使用if let,while let如果您只对单个变量的数据感兴趣.尽管let需要一个详尽的模式,if let并且while let需要一个非详尽的格局.你会经常看到它们用于Option:
fn main() {
if let Some(x) = std::env::args().len().checked_add(1) {
println!("{}", x);
} else {
println!("too many args :(");
}
}
Run Code Online (Sandbox Code Playgroud)