Rust 我可以使用Deref<;目标=其他>;从其他系统继承特性实现?
我有一个Rust 我可以使用Deref<;目标=其他>;从其他系统继承特性实现?,rust,traits,Rust,Traits,我有一个字符串ErrorMessage,我用它来表示原型板条箱中的错误。(我知道这是一种不好的做法。我将在发布之前构造一组适当的不同错误类型。) 我需要ErrorMessage来实现trait,它(实际上)是空的,但要求它也实现和trait,我已经完成了 pub结构错误消息(pub字符串); 错误消息{}的impl std::error::error impl std::fmt::显示错误消息{ fn fmt(&self,f:&mut std::fmt::Formatter)->std::fmt
字符串
ErrorMessage
,我用它来表示原型板条箱中的错误。(我知道这是一种不好的做法。我将在发布之前构造一组适当的不同错误类型。)
我需要ErrorMessage
来实现trait,它(实际上)是空的,但要求它也实现和trait,我已经完成了
pub结构错误消息(pub字符串);
错误消息{}的impl std::error::error
impl std::fmt::显示错误消息{
fn fmt(&self,f:&mut std::fmt::Formatter)->std::fmt::Result{
self.0.fmt(f)
}
}
错误消息的impl std::fmt::调试{
fn fmt(&self,f:&mut std::fmt::Formatter)->std::fmt::Result{
self.0.fmt(f)
}
}
。然而,我最近遇到了一个问题,我想知道它是否能够自动将trait实现委托给String
的self.0
实现
错误消息的impl std::ops::Deref{
类型Target=str;
fn deref(&self)->&str{
&self.0
}
}
这允许我在错误消息上调用.to_string()
等方法,并允许它使用我的Deref
实现在self.0
/*self
上自动查找fmt
和to_string
实现
但是,ErrorMessage
本身实际上并不是Display
或Debug
。如果我尝试println代码>或格式代码>一个实例,我直接得到一个错误,然后
fn main()->结果{
Err(erromessage(“helloworld.to_string()))
}
error[E0277]:`ErrorMessage`未实现`std::fmt::Display`
-->src/main.rs:2:6
|
2 | impl std::error::ErrorMessage{}的错误
|^^^^^^^^^^^^^^^^^^`ErrorMessage`无法使用默认格式化程序进行格式化
|
=帮助:`ErrorMessage'未实现特性`std::fmt::Display``
是否有任何方法可以使用Deref
、DerefMut
,或类似的方法来允许取消引用的值满足原始值的特征边界。我正在寻找一些自动的东西,作为手动编写impl
块来委托每个块的替代方法
是否有任何方法可以使用Deref
、DerefMut
,或类似的方法来允许取消引用的值满足原始值的特征边界
不。与内部类型解除引用的外部类型本身并不实现内部类型所实现的特性
作为手动写入impl
块以委派每个块的替代方法
您最好的选择可能是创建一个或多个宏。我个人对此抱有希望。请注意,如果您修复了deref实现(请参阅),您的代码确实可以工作,您可以派生Debug for ErrorMessage,但仍然应该实现Displaymanually@aochagavia谢谢你的更正!我已经修复了deref定义并更新了沙盒示例。不幸的是,这仍然不能让我摆脱impl Debug
和impl Display
块。您不能继承trait实现,但对于常见的trait,您可以使用板条箱。这回答了你的问题吗?如果是的话,我可以把它作为答案发布。@aochagavia谢谢你的建议,很高兴知道!但这不是我想要的。代表团RFC非常相关,谢谢链接!