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)
}
);
}
给出这个错误:
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>
快捷方式,但仅限于可以发送的错误,允许它跨线程工作?