Multithreading 将发送特征添加到装箱特征对象时的奇怪行为

Multithreading 将发送特征添加到装箱特征对象时的奇怪行为,multithreading,rust,compiler-errors,thread-safety,traits,Multithreading,Rust,Compiler Errors,Thread Safety,Traits,下面是一个错误结构: #[派生(调试)] 发布结构错误{ msg:&'static str, //来源:选项,//old 来源:选项,//新建 } impl错误{ fn新的原因(消息:&'static str,err:E)->Self 哪里 E:'static+std::error::error+Send, { 自我{ 味精:味精,, 来源:一些(Box::from(err)), } } } impl std::fmt::错误显示{ fn fmt(&self,fmt:&mut std::fmt:

下面是一个错误结构:

#[派生(调试)]
发布结构错误{
msg:&'static str,
//来源:选项,//old
来源:选项,//新建
}
impl错误{
fn新的原因(消息:&'static str,err:E)->Self
哪里
E:'static+std::error::error+Send,
{
自我{
味精:味精,,
来源:一些(Box::from(err)),
}
}
}
impl std::fmt::错误显示{
fn fmt(&self,fmt:&mut std::fmt::Formatter)->std::fmt::Result{
写!(fmt,“{}”,self.msg)//HACK
}
}
impl std::error::error for error{
fn source(&self)->选项src/main.rs:27:9
|
27 | self.source.as_ref().map(| err | err.as_ref())
|^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^`
|
=注意:对于magic#1,应为enum`std::option::option,这是因为标准库具有以下实现:

impl<'a, E: Error + 'a> From<E> for Box<dyn Error + 'a>
impl<'a, E: Error + Send + Sync + 'a> From<E> for Box<dyn Error + Send + Sync + 'a>
如果代码更复杂,
as
可能不可行。那么
匹配就完全足够了

使用固定代码



1:我想我读过关于使这些转换自动(自动特征上的协变?)的书,但我在任何地方都找不到它…

@Shepmaster就是这样,我相信:。我总是要花很长时间思考它们,通常都会弄错,所以我帮不了忙!
impl<'a, E: Error + 'a> From<E> for Box<dyn Error + 'a>
impl<'a, E: Error + Send + Sync + 'a> From<E> for Box<dyn Error + Send + Sync + 'a>
self.source.as_ref().map(|err| err.as_ref() as _)