当前位置: 首页 > 知识库问答 >
问题:

如果两个性状都实现了作为参考,我如何为所有实现性状A的类型实现性状B?

闾丘博
2023-03-14

我们有两个特征AB

  1. 我可以简单地为所有实现A的类型实现B
  2. 我可以简单地实现A,以引用任何实现A的类型。
  3. 我可以简单地实现B,以引用任何实现B的类型。

实际上,执行这三个操作都会导致冲突,因为现在对实现a的类型的引用将有两个B的实现。一个是由于impl

我无法删除impl

下面是一个展示行为的示例代码。

trait A {}
trait B {}

impl<'a, T: A> A for &'a T {}
impl<T: A> B for T {}

impl<'a, T: B> B for &'a T {}

这将导致以下错误:

error[E0119]: conflicting implementations of trait `B` for type `&_`:
  |
  | impl<T: A> B for T {}
  | --------------------- first implementation here
  | impl<'a, T: B> B for &'a T {}
  | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ conflicting implementation for `&_`

是否可以使用Rust-typesystem,以确保在出现impl B时


共有1个答案

葛胜泫
2023-03-14

关于这个话题,Rust internals论坛上进行了一些讨论,首先是Nicholas Matsakis关于如何处理重叠的trait实现问题的博客文章。

今天,(不稳定的)锈菌有一些IML专业化,但这只适用于更为通用的更为具体的IML。

所以我认为答案是今天没有一个好的方法来做这件事,但是在未来的某个时候,Rust很有可能会进化到允许表达重叠的特质内涵。

 类似资料:
  • 编译以下代码时: 我得到一个错误: 错误消息试图说明什么?还有,怎么修? 有一个相关的问题,但解决方案是修改特征<code>a</code>(在我的例子中对应于<code>可绘制</code>),但这在这里是不可能的,因为<code>可以绘制</code>来自外部库。

  • 我有一个问题: 多个结构实现一个trait 都可以以相同的方式实现trait 我考虑过写这个(简短版本) 游戏场 这无法编译: 这里怎么了?或者有没有其他方法可以通用地实现此,而不必为和分别键入一次? 谢谢你们

  • 用 echarts 实现 饼状图 这种

  • 我想创建一个全局状态(数据对象,而不是服务对象)。 我创建了类。 我想避免常规的全局状态, 但是,所有的教程都展示了如何为服务对象设置一个DI,并注册到接口。 如何根据需要使用注入? 编辑 我试过: 公共类AppInjector扩展了AbstractModule{ 但是我看到中没有新的long值。

  • 突变性可以是性状中的一个通用参数吗?我想为一个类型的可变和不可变变体实现一个特性,而不必复制 一厢情愿的伪代码: