gpt4 book ai didi

enums - 从没有模式匹配的枚举中读取

转载 作者:行者123 更新时间:2023-11-29 08:30:55 24 4
gpt4 key购买 nike

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 语句来解构该枚举。 letmatch 语句中的模式必须是详尽无遗的,并且与枚举中的单个变体匹配的模式是详尽无遗的。但是只有一种变体的枚举几乎从未被使用过;一个结构就可以很好地完成这项工作。如果您打算稍后添加变体,最好立即编写一个 match

enum Single {
S(i32),
}

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

另一方面,如果您有一个具有多个变体的枚举,如果您对数据感兴趣,也可以使用 if letwhile let仅来自单个变体。 letmatch 需要穷举模式,而 if letwhile 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com