rust - 为外来类型实现外来特征

标签 rust

<分区>

所以我看到有理由禁止孤儿特征实现,因为考虑到向前兼容性(以防止在库中添加进一步的特征实现破坏使用类型特征的地方)并且它可能使编译更多难的。但我想知道 Rust 社区会认为哪种解决方法是最理想的解决方法:

(以防万一这还不够背景:我正在尝试将 rusqlitechronoDateTime 一起使用。所以我想为 FromSql 实现 rusqlite 的 ToSqlDateTime<UTC> 特征。但这显然不像我想象的那么容易——我目前才刚刚开始使用 Rust。)

  • 派生 rusqlite 并实现特征。 (我觉得这不是最好的方法,因为也许只有我需要这个特性实现,所以我可能最终不得不让我自己的 fork 保持最新。而且我不是能够实现这些特征是因为有一些我还不能完全理解的复杂的泛型。)
  • 实现我自己的 DateTime struct(可能是最好的解决方法,但我觉得这只是一些不必要的工作复制)。
  • 以某种方式“复制”DateTime<UTC> trait 并给它一个别名并实现 FromSqlToSql我的别名类型的特征(但是我认为这也不是微不足道的,当我尝试它时我无法让它工作,因为它仍然被视为外部类型)。

我希望有人能向我解释如何最好地解决这个问题,从我纯粹的 OOP 经验我希望能够继承 DateTime并实现接口(interface),但是(出于正当理由)这不是在 Rust 中完成的方式......

最佳答案

最简单的方法是使用新类型模式:

extern crate a;
extern crate b;

use a::SomeTrait;
use b::SomeStruct;

pub struct MySomeStruct(SomeStruct);

impl SomeTrait for MySomeStruct {
    ...
}

在这里,您围绕外部结构创建了一个包装器,并且由于这个包装器是属于您的包装箱的完全不同的类型,您可以自由地为它实现 a::SomeTrait。这与您的第二点类似,只是您绝对不需要从头开始重新实现该类型。

当然,您无法在MySomeStruct 上调用SomeStruct 的所有方法。你必须转发所有你想要的方法,或者当你不再需要它的特征实现时打开内部值,或者你可以 impl Deref for MySomeStruct { type Target = SomeStruct; ... ,但后者被认为是一种反模式。

关于rust - 为外来类型实现外来特征,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35160995/

相关文章:

rust - 是否可以仅为 Release模式调用 build.rs?

rust - 如何在 WebAssembly 中从 Rust 返回一个字符串(或类似字符串)?

rust - 在 Rust 中,Haskell 的 [n..m] 的惯用等价物是什么?

multidimensional-array - 如何过滤掉 ndarray 中的特定列?

rust - 如何在HashMap中获取值以相互引用?

closures - 如何在 Rust 的结构中存储闭包?

rust - 地址范围: Does not live long enough

c# - Rust 中 fn 参数的协方差使用什么?

syntax - 在 for 循环中引用/取消引用向量元素

rust - 如何将字符串连接到宏派生中的标识?