为什么两个不同特征的一揽子实现会发生冲突?

Jae*_*bum 6 traits rust

假设我有这段代码:

pub trait A {}
pub trait B {}

pub trait SomeBehavior {
  fn func() -> bool;
}
Run Code Online (Sandbox Code Playgroud)

我想提供这样的总体A实现B

impl <T> SomeBehavior for T where T: A {
  fn func() -> bool { true }
}

impl <T> SomeBehavior for T where T: B {
  fn func() -> bool { false }
}
Run Code Online (Sandbox Code Playgroud)

但这会产生以下错误:

pub trait A {}
pub trait B {}

pub trait SomeBehavior {
  fn func() -> bool;
}
Run Code Online (Sandbox Code Playgroud)

为什么编译器将不同特征的两种不同实现视为相同实现?

kmd*_*eko 8

Rust 有“特征一致性”的概念,即对于类型和特征的任何组合,最多应该有一个该特征的实现。这是指导 Rust 的“孤儿规则”的概念,旨在确保下游 crate 中不会发生冲突的实现。

A因此,上述两个一揽子实现的问题是一个类型可以同时实现和 的可能性B。该类型将有两种可能的实现。SomeBehavior

struct MyType;
impl A for MyType;
impl B for MyType;

let t = MyType;
let _ = t.func(); // how to choose?
Run Code Online (Sandbox Code Playgroud)

不幸的是,Rust 的部分内容并没有特别详细的记录;可能是因为它很复杂,有争议,多年来规则已经改变,并且将来可能会再次改变。资源分散在博客文章、RFC 和问题之间,但您可以在粉笔书(下一代特征求解器)的连贯性部分中找到重要内容。

将来可能会添加一些功能来实现此功能或类似功能: