- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 String
newtype ErrorMessage
我在原型(prototype)箱中用于错误。 (我知道这是一种不好的做法。我将在发布之前构建一组适当的不同错误类型。)
我需要 ErrorMessage
来实现 Error
特征,它(实际上)是空的但要求它也实现 Display
和 Debug
特质,我已经做到了。
pub struct ErrorMessage(pub String);
impl std::error::Error for ErrorMessage {}
impl std::fmt::Display for ErrorMessage {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
self.0.fmt(f)
}
}
impl std::fmt::Debug for ErrorMessage {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
self.0.fmt(f)
}
}
This works fine .然而,我最近遇到了Deref
并且想知道它是否可以自动将特征实现委托(delegate)给 self.0
中的 String
的实现。
impl std::ops::Deref for ErrorMessage {
type Target = str;
fn deref(&self) -> &str {
&self.0
}
}
这允许我在 ErrorMessage
和 deref coercion 上调用 .to_string()
等方法将让它使用我的 Deref
实现自动找到 self.0
/ 上的
。fmt
和 to_string
实现>* self
但是,ErrorMessage
本身 实际上并不是Display
或Debug
。如果我尝试直接 println!
或 format!
一个实例,我会得到一个错误,并且 it doesn't satisfy the bounds for Error
.
fn main() -> Result<(), ErrorMessage> {
Err(ErrorMessage("hello world".to_string()))
}
error[E0277]: `ErrorMessage` doesn't implement `std::fmt::Display`
--> src/main.rs:2:6
|
2 | impl std::error::Error for ErrorMessage {}
| ^^^^^^^^^^^^^^^^^ `ErrorMessage` cannot be formatted with the default formatter
|
= help: the trait `std::fmt::Display` is not implemented for `ErrorMessage`
是否有任何方法可以使用 Deref
、DerefMut
或类似的东西来允许取消引用的值满足原始值的特征边界。我正在寻找一些自动化的东西,作为手动编写 impl
block 来委托(delegate)每个 block 的替代方法。
最佳答案
Is there any way to use
Deref
,DerefMut
, or something similar to allow dereferenced values to satisfy trait bounds for the original values.
没有。取消引用内部类型的外部类型本身并不实现内部类型所具有的特征。
as an alternative to manually writing
impl
blocks to delegate each of them.
您最好的选择可能是创建一个或多个宏。我个人对 first-class delegation support 抱有希望.
关于rust - 我可以使用 Deref<Target = Other> 从 Other 继承特征实现吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55032618/
我是一名优秀的程序员,十分优秀!