gpt4 book ai didi

rust - 如何匹配Arc内的选项?

转载 作者:行者123 更新时间:2023-11-29 07:56:28 25 4
gpt4 key购买 nike

docs for Arc<T> 说:

Arc<T> automatically dereferences to T (via the Deref trait), so you can call T's methods on a value of type Arc<T>.

但是有什么方法可以在 Option 上进行匹配吗? -所有类型?

这是一个简单的例子:

use std::sync::Arc;

fn main() {
let foo: Arc<Option<String>> = Arc::new(Some("hello".to_string()));

if foo.is_some() {
println!("{}", foo.unwrap());
}

match foo {
Some(hello) => {
println!("{}", hello);
}
None => {}
}
}

编译错误是:

error[E0308]: mismatched types
--> src/main.rs:11:9
|
11 | Some(hello) => {
| ^^^^^^^^^^^ expected struct `std::sync::Arc`, found enum `std::option::Option`
|
= note: expected type `std::sync::Arc<std::option::Option<std::string::String>>`
found type `std::option::Option<_>`

error[E0308]: mismatched types
--> src/main.rs:14:9
|
14 | None => {}
| ^^^^ expected struct `std::sync::Arc`, found enum `std::option::Option`
|
= note: expected type `std::sync::Arc<std::option::Option<std::string::String>>`
found type `std::option::Option<_>`

最佳答案

不,您不能匹配 Option Arc 内部.要在模式匹配中使用类型,您必须可以使用该类型的实现,但是 Arc 的实现不公开。


在某些情况下,您可以执行某种类型的转换以匹配引用

例如,自 Arc<T>工具 Deref , 您可以使用 *运算符通过 Arc<T> 取消引用底层T .因为有 some ergonomic syntax对于这种匹配,您可以引用 Option 中的值没有取得它的所有权:

match *foo {
Some(ref hello) => {
println!("{}", hello);
}
None => {}
}

您还可以使用 Option::as_ref转换 &Option<T> (automatically dereferencedArc<T> 通过 Deref )到 Option<&T> :

match Option::as_ref(&foo) {
Some(hello) => {
println!("{}", hello);
}
None => {}
}

不幸的是,你不能只调用 .as_ref()因为特征方法 AsRef::as_ref优先考虑。

在这两种情况下,使用 if let 更为惯用如果您只关心其中一个火柴臂:

if let Some(ref hello) = *foo {
println!("{}", hello);
}

关于rust - 如何匹配Arc内的选项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48471607/

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