Rust documentation gives this example中有一个名为some_valueResult<T, E>实例:

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

有没有办法在没有模式匹配的情况下读取some_value?在运行时甚至不判断内容的类型呢?也许我们以某种方式绝对肯定地知道所包含的类型,或者也许我们只是一个糟糕的程序员.不管是哪种情况,我只是好奇这是否可能,而不是这是否是个好主意.

这个分支如此困难(或不可能?),这让我觉得这是一个非常有趣的语言特性避免.

推荐答案

在最低级别,如果没有match1,则无法读取枚举字段.

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

如果您知道match中的某个特定情况是无法访问的,通常的做法是在该分支上写unreachable!()(unreachable!()简单地扩展为panic!(),并带有特定的消息).


1如果一个枚举只有一个变量,还可以编写一个简单的let语句来解构枚举.letmatch语句中的模式必须是穷举的,与枚举中的单个变量匹配的模式是穷举的.但只有一个变量的枚举几乎从未使用过;一个 struct 可以很好地完成这项工作.如果你打算以后添加变体,最好马上写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 :(");
    }
}

Rust相关问答推荐

是否有可能同时避免不兼容的不透明类型和代码重复?

文档示例需要导入相关的 struct ,但仅在运行测试时.这是故意的行为吗?

你是如何在铁 rust 一侧的金牛座获得应用程序版本的?

如何为 struct 字段设置新值并在Ruust中的可变方法中返回旧值

rust 蚀生命周期 不匹配-不一定超过此处定义的生命周期

在复制类型中使用std::ptr::WRITE_VILAR进行内部可变性的安全性(即没有UnSafeCell)

当我编译 Rust 代码时,我是否缺少 AVX512 的目标功能?

实现 Deref 的 struct 可以返回对外部数据的引用吗?

Rust 中多个 & 符号的内存表示

有没有办法隐式绑定 let/match 操作的成员?

没有得到无法返回引用局部变量`queues`的值返回引用当前函数拥有的数据的值的重复逻辑

如何判断服务器是否正确接收数据

为什么允许重新分配 String 而不是 *&String

If let expression within .iter().any

无法把握借来的价值不够长寿,请解释

Rust,使用枚举从 HashMap 获取值

如何获取包裹在 Arc<> 和 RwLock<> 中的 Rust HashMap<> 的长度?

为什么分配对变量的引用使我无法返回它

如何用另一个变量向量置换 rust simd 向量?

返回 &str 但不是 String 时,borrow 时间比预期长