我正在try 编译类似以下内容的内容:

use anyhow::Result;
use std::sync::{mpsc, Mutex, OnceLock};
use std::cell::Cell;
use std::fmt;

static COMS: OnceLock<Mutex<Coms>> = OnceLock::new();

struct Coms {
    tx: Cell<Option<mpsc::Sender<Msg>>>,
    rx: Cell<Option<mpsc::Receiver<Msg>>>,
}

enum Msg {}

fn bar() -> Result<()> {
    let (tx, rx) = mpsc::channel();
    COMS.set(
        Mutex::new(
            Coms {
                tx: Cell::new(Some(tx)),
                rx: Cell::new(Some(rx)),
            }
        )
    );
    //)?;
    Ok(())
}

fn main() {
    let _ = bar();
}

我收到关于未使用的结果的预期警告:

warning: unused `Result` that must be used
  --> src/main.rs:17:5
   |
17 | /     COMS.set(
18 | |         Mutex::new(
19 | |             Coms {
20 | |                 tx: Cell::new(Some(tx)),
...  |
23 | |         )
24 | |     );
   | |_____^

但是,如果我将行与);替换为)?;,则会得到如下错误:

error[E0277]: the trait bound `Mutex<Coms>: std::error::Error` is not satisfied
  --> src/main.rs:25:6
   |
25 |     )?;
   |      ^ the trait `std::error::Error` is not implemented for `Mutex<Coms>`
   |

OnceLock::set()documentation表示它返回Result,那么为什么在第二种情况下它看起来像是返回Mutex<Coms>呢?

为什么Rustc似乎认为第一个 case 是Result分(预计),第二个 case 是Mutex<Coms>分?这是使用rustc 1.71.0.我一定是误解了编译器想要告诉我的内容.

推荐答案

这是一辆Result.具体地说,signature of that function

pub fn set(&self, value: T) -> Result<(), T>

如果成功,我们会返回().失败时,我们将T的所有权返还给呼叫者.

在您的例子中,返回类型是Result<(), Mutex<Coms>>.

现在,anyhow::Error是一个非常整洁的类型.它能够存储任何错误条件,但不能存储any种类型.它不能存储i32或许多其他随机类型.它只能存储实现Error的类型,而Mutex不实现该特征.

你不能把Mutex<Coms>换成anyhow::Error.

如果您不关心错误条件,则可以显式地丢弃它.

let _ = COMS.set(...);

这是对拉斯特的一个响亮的断言:"是的,我们可能会得到Err分.我不在乎;忽略它."

您可以使用map_errMutex<Coms>替换为实际错误类型,然后使用that?将其转换为anyhow::Error.你可以在失败的集合上panic ,使用expect.

当然,您也可以直接对结果进行模式匹配,然后对原始互斥锁执行一些定制操作.

Rust相关问答推荐

有没有方法处理rust中嵌套的ok_or()?

阻止websocket中断的中断中断的终端(操作系统错误4)

为什么允许我们将可变引用转换为不可变引用?

在铁 rust 中传递所有权

Pin<;&;mut可能将Uninit<;T>;>;合并为Pin<;&;mut T>;

如果变量本身不是None,如何返回;如果没有,则返回None&Quot;?

正在将带有盒的异步特征迁移到新的异步_fn_in_特征功能

用于实现获取 struct 体 id 的特征规范

Rust LinkedList 中的borrow 判断器错误的原因是什么?

为什么 Rust 字符串没有短字符串优化 (SSO)?

在Rust中实现Trie数据 struct 的更好方式

不安全块不返回预期值

如何使用泛型满足 tokio 异步任务中的生命周期界限

Rust/Serde/HTTP:序列化`Option`

我的 Axum 处理程序无法编译:未实现 IntoResponse 特征

更好的方法来模式匹配带有 Rust 的窥视孔装配说明窗口?

在 FFI 的上下文中,未初始化是什么意思?

在 Rust 中返回对枚举变体的引用是个好主意吗?

需要括号的宏调用中的不必要的括号警告 - 这是编写宏的糟糕方法吗?

传递 Option<&mut T> 时何时需要 mut