- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
rust 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,您将无法读取枚举字段。
枚举上的方法可以更方便地访问枚举中的数据(例如 Result::unwrap
),但在幕后,它们总是通过匹配
实现。
如果您知道 match
中的特定情况是无法访问的,通常的做法是编写 unreachable!()
在该分支上(unreachable!()
简单地扩展为带有特定消息的 panic!()
)。
1 如果您有一个只有一个变体的枚举,您也可以编写一个简单的 let
语句来解构该枚举。 let
和 match
语句中的模式必须是详尽无遗的,并且与枚举中的单个变体匹配的模式是详尽无遗的。但是只有一种变体的枚举几乎从未被使用过;一个结构就可以很好地完成这项工作。如果您打算稍后添加变体,最好立即编写一个 match
。
enum Single {
S(i32),
}
fn main() {
let a = Single::S(1);
let Single::S(b) = a;
println!("{}", b);
}
另一方面,如果您有一个具有多个变体的枚举,如果您对数据感兴趣,也可以使用 if let
和 while let
仅来自单个变体。 let
和 match
需要穷举模式,而 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 :(");
}
}
关于enums - 从没有模式匹配的枚举中读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58031728/
我是一名优秀的程序员,十分优秀!