在 Rust 中使用 `Result<T, Box<dyn Error>>` 技巧,但跨多个线程

Mig*_*ell 4 multithreading rust rayon

使用返回来注释函数Result<X, Box<dyn Error>>以允许它们返回任何错误是一个常见的技巧。但是,如果错误本身没有实现Send. 例如这段代码:

use rayon::prelude::*; // 1.5.1
use std::error::Error;

fn main(){
    ["1", "2", "three"]
        .into_par_iter()
        .try_for_each(|i| -> Result<usize, Box<dyn Error>> {
            let inner = i.parse::<usize>()?;
            Ok(inner)
        }
    );
}
Run Code Online (Sandbox Code Playgroud)

给出这个错误:

error[E0277]: `dyn std::error::Error` cannot be sent between threads safely
Run Code Online (Sandbox Code Playgroud)

操场


另一方面,如果您尝试指定错误必须实现Send,则?运算符将不再起作用:

error[E0277]: `dyn std::error::Error` cannot be sent between threads safely
Run Code Online (Sandbox Code Playgroud)
error[E0277]: `?` couldn't convert the error to `Box<dyn std::error::Error + Send>`
Run Code Online (Sandbox Code Playgroud)

操场

我怎样才能继续使用Box<dyn Error>快捷方式,但仅限于可以发送的错误,允许它跨线程工作?

use*_*968 6

在FPGA实现std你要找的是这个

impl<'a, E: Error + Send + Sync + 'a> From<E> for Box<dyn Error + Send + Sync + 'a>
Run Code Online (Sandbox Code Playgroud)

将闭包的返回类型更改为Result<usize, Box<dyn Error + Send + Sync>>,修复不相关的类型错误,它将编译。

  • 下次请给我留出 14 分钟多一点的时间来探索解决方案的优缺点,谢谢。 (2认同)