假设我有这段代码:
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)
为什么编译器将不同特征的两种不同实现视为相同实现?
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 和问题之间,但您可以在粉笔书(下一代特征求解器)的连贯性部分中找到重要内容。
将来可能会添加一些功能来实现此功能或类似功能: