gpt4 book ai didi

enums - 从枚举中读取而不进行模式匹配

转载 作者:行者123 更新时间:2023-12-03 11:46:47 25 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读取?甚至在运行时不检查内容类型怎么办?也许我们以某种绝对的方式知道所包含的类型,或者也许我们只是一个糟糕的程序员。无论哪种情况,我只是想知道它是否有可能,而不是一个好主意。

这让我印象深刻,因为它是一个非常有趣的语言功能,难以避免(或无法避免?)这一分支。

最佳答案

在最低级别上,不,没有match 1,您将无法读取枚举字段。

枚举中的方法可以更方便地访问枚举中的数据(例如 Result::unwrap ),但是在幕后,它们始终使用match实现。

如果您知道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/66005994/

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