在 Rust 中使用 `Result<T, Box<dyn Error>>` 技巧,但跨多个线程
Using the `Result<T, Box<dyn Error>>` trick in Rust, but across multiple threads
使用 returning Result<X, Box<dyn Error>>
注释您的函数以允许它们 return 任何错误是一个常见的技巧。但是,如果错误本身实现 Send
,则您无法从线程 return 执行此操作。例如这段代码:
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)
}
);
}
出现此错误:
error[E0277]: `dyn std::error::Error` cannot be sent between threads safely
另一方面,如果您尝试指定错误必须实现 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 + Send>> {
let inner = i.parse::<usize>()?;
Ok(inner)
}
);
}
error[E0277]: `?` couldn't convert the error to `Box<dyn std::error::Error + Send>`
我如何才能继续使用 Box<dyn Error>
快捷方式,但仅针对可以发送的错误,使其能够跨线程工作?
您要查找的 std
中的实现是 this:
impl<'a, E: Error + Send + Sync + 'a> From<E> for Box<dyn Error + Send + Sync + 'a>
将您的闭包 return 类型更改为 Result<usize, Box<dyn Error + Send + Sync>>
,修复不相关的类型错误,它将编译。
使用 returning Result<X, Box<dyn Error>>
注释您的函数以允许它们 return 任何错误是一个常见的技巧。但是,如果错误本身实现 Send
,则您无法从线程 return 执行此操作。例如这段代码:
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)
}
);
}
出现此错误:
error[E0277]: `dyn std::error::Error` cannot be sent between threads safely
另一方面,如果您尝试指定错误必须实现 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 + Send>> {
let inner = i.parse::<usize>()?;
Ok(inner)
}
);
}
error[E0277]: `?` couldn't convert the error to `Box<dyn std::error::Error + Send>`
我如何才能继续使用 Box<dyn Error>
快捷方式,但仅针对可以发送的错误,使其能够跨线程工作?
您要查找的 std
中的实现是 this:
impl<'a, E: Error + Send + Sync + 'a> From<E> for Box<dyn Error + Send + Sync + 'a>
将您的闭包 return 类型更改为 Result<usize, Box<dyn Error + Send + Sync>>
,修复不相关的类型错误,它将编译。