gpt4 book ai didi

rust - 我可以使用 Deref 从 Other 继承特征实现吗?

转载 作者:行者123 更新时间:2023-11-29 08:00:11 26 4
gpt4 key购买 nike

我有一个 String newtype ErrorMessage 我在原型(prototype)箱中用于错误。 (我知道这是一种不好的做法。我将在发布之前构建一组适当的不同错误类型。)

我需要 ErrorMessage 来实现 Error特征,它(实际上)是空的但要求它也实现 DisplayDebug特质,我已经做到了。

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
}
}

这允许我在 ErrorMessagederef coercion 上调用 .to_string() 等方法将让它使用我的 Deref 实现自动找到 self.0/ 上的 fmtto_string 实现>* self

但是,ErrorMessage 本身 实际上并不是DisplayDebug。如果我尝试直接 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`

是否有任何方法可以使用 DerefDerefMut 或类似的东西来允许取消引用的值满足原始值的特征边界。我正在寻找一些自动化的东西,作为手动编写 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com