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

2024-02-02

我有一个String newtype https://doc.rust-lang.org/rust-by-example/generics/new_types.html ErrorMessage我用它来解决原型箱中的错误。 (我知道这是一个不好的做法。我将在发布之前构建一组适当的不同错误类型。)

I need ErrorMessage实施Error https://doc.rust-lang.org/std/error/trait.Error.html特征,它(实际上)是空的,但要求它也实现Display https://doc.rust-lang.org/std/fmt/trait.Display.html and Debug https://doc.rust-lang.org/std/fmt/trait.Debug.html特征,我已经做到了。

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

。然而,我最近遇到Deref https://doc.rust-lang.org/std/ops/trait.Deref.html并想知道它是否可以自动将特征实现委托给实现String from self.0.

impl std::ops::Deref for ErrorMessage {
    type Target = str;

    fn deref(&self) -> &str {
        &self.0
    }
}

这允许我调用类似的方法.to_string() on an ErrorMessage, and 解除引用强制 https://doc.rust-lang.org/1.30.0/book/first-edition/deref-coercions.html会让它用我的Deref实现自动查找fmt and to_string的实施self.0/*self.

然而,ErrorMessage itself实际上不是Display or Debug。如果我尝试println! or format!直接实例我收到错误,并且.

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块来委派每个人。


有什么办法可以使用吗Deref, DerefMut,或类似于允许取消引用的值满足原始值的特征边界的东西。

不会。取消引用内部类型的外部类型本身并不实现内部类型所具有的特征。

作为手动写入的替代方法impl块来委派每个人。

您最好的选择可能是创建一个或多个宏。我个人对此抱有希望一流的代表团支持 https://github.com/rust-lang/rfcs/pull/2393.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我可以使用 Deref 从 Other 继承特征实现吗? 的相关文章

随机推荐

  • 目标 C:如何解决代码中的泄漏(来自仪器的结果)

    我为我的应用程序运行了仪器 其中包含 UITableView 并得到了以下结果 每次单元格变得可见时 单元格将调用方法 UICustomButton SetButtonWithAnswer 编辑 添加了更多屏幕截图 问题是我不确定到底是什么
  • 将计算列添加到 pandas 数据框中

    我对 Python pandas 和一般编程完全陌生 我无法弄清楚以下内容 我在 pandas 的帮助下访问了数据库 并将查询中的数据放入数据框 df 中 其中一列包含生日 可以采用以下形式 1980 年 1 月 25 日 字符串 01 2
  • CYPHER 查询中的 LIKE 子句

    Cypher 查询似乎不支持 LIKE 是否有任何其他构造可以执行相同的任务 例如 start n node where n Name LIKE SUBSTRING return n Name n 使用正则表达式 http neo4j co
  • “%H:%M”格式的时间增量

    有一种方法可以转换timedelta列转换为 H M 格式的字符串 我什至需要这个timedeltas超过24小时 我想这样做是为了制作一个可在类似电子表格的软件 excel google Sheets 中使用的 csv 文件 没有任何内置
  • Nodejs for 循环并等待循环完成

    我有以下代码 Marks all users which are reading the book with the bookId var markAsReading function bookId cb User find functio
  • 詹金斯转义 sed 命令

    有人可以为我在 Jenkins groovy 脚本中转义这个 sed shell 命令吗 So hard sh sed s AssemblyInformationalVersion 1 productVersion 3 g Assembly
  • 如何确定Android .so文件的ABI(即armeabi或armeabi-v7a)?

    我有一个由第三方供应商提供的 so 文件 该文件将包含在我的 Android 应用程序中 我无法访问源代码 也无法 轻松 联系供应商 有没有办法让我通过检查 so 文件来确定它是否是针对armeabi or armeabi v7a ABI
  • 如何使用其他表中的列/字段对 PostgreSQL 表进行集群

    我想根据其他表中的信息对 PostgreSQL 表进行聚类 想象一下两张桌子 foos id baz id name and bars foo id name bars foo id是一个外键引用foos id 我想对 bar 表进行聚类
  • 我可以访问来自不同语言环境的 android 资源吗?

    我的应用程序中有两个区域设置 我可以访问资源 例如来自不同语言环境的字符串数组而不更改当前语言环境吗 我的意思是 对于编码 我不喜欢在 设置 中更改它 更好的解决方案是 如果您使用的是 API 17 NonNull protected St
  • 在包安装期间执行 R 脚本

    希望这有一个简单的答案 但我还没有找到它 我正在编写一个 R 包 当安装在 Windows 上时 我希望它执行一个搜索系统文件的脚本 即list files path C Program Files 然后将该路径保存到包目录作为文本文件以供
  • 使用 jquery 将 html 表格转为 excel

    我有这个有效的 jquery 函数 但我需要添加一些东西 我在桌子上设置了一个过滤器来隐藏列 当我隐藏列并单击导出时 它无论如何都会使用所有字段 如何只导出未隐藏的表列 var write to excel function var uri
  • 使用 ggplot 在 R 中创建堆积百分比条形图

    我一直在寻找一种方法 能够根据受访者的性别分类 将堆积条形图响应显示为百分比值 我成功地使用变量 性别 进行填充创建了堆积条形图 但我希望该图显示该变量之间的比例 我知道使用 count sum count 和 scale y 可以更改 y
  • 使用WCF上传文件

    我需要一个 WCF 服务来由用户上传大文件 以下哪一项提供了更优化的性能 OperationContract public void UploadFile Stream inputsreaam or OperationContract pu
  • 在 EF6 中将匿名类型转换为 IEnumerable<>

    我正在使用实体框架开发 MVC 应用程序 我想从表中获取 5 列并将它们返回到一个IE可枚举类型 我的代码是 IEnumerable
  • T-SQL 将日期时间修剪为最近的日期?

    重复的 删除日期时间值 SQL Server 的时间部分的最佳方法是什么 https stackoverflow com questions 2775 我有一个列 用于跟踪使用日期时间创建事物的时间 但我想生成一个按天分组的报告 因此我需要
  • R 中具有两个单独值的词云

    作为 R 新手 我正在制作一个显示两个变量的词云 frequency and rating 使用通用表格 我希望按州显示假设的大学数量 字体 数字从大到小 以及假设的平均大学评级 1 绿色 良好 3 黄色 平均 5 红色 坏 我能够创建这个
  • 当 CreatePackageOnPublish 设置为 true 时,TFS Team Build 中的长路径出现问题。

    由于 TFS Team Build 在参数设置时创建的长路径 我们在构建时遇到了问题发布时创建包被设定为true 在目录中软件包临时表 见后图 包被存储 但我不明白为什么这个目录结构是必要的以及如何定制它 问题是部署或新的 TFS 构建会因
  • 如何在 JNI 中从 C++ 调用 Java 方法

    所以我正在编写一个使用大型 C 库的 Android 应用程序 我已经一切正常 以便 java 应用程序可以调用 c 委托方法 但我发现自己希望可以将消息从 c 记录到 Android 日志中 这对于java来说很容易 但是我不知道如何从c
  • CSS 计算不适用于 宽度

    我想要Cell A为剩下的两个单元格留出 100px 的空间 我会想calc 100 100px 就足够了 因为这在许多其他情况下都可以正常工作 为什么这里不起作用 table width 100 border collapse colla
  • 我可以使用 Deref 从 Other 继承特征实现吗?

    我有一个String newtype https doc rust lang org rust by example generics new types html ErrorMessage我用它来解决原型箱中的错误 我知道这是一个不好的做