Rust 中的 Trait 一致性(Coherence)是指对于任意给定的类型,对于某个特定的 Trait,最多只能有一个有效的实现。这个规则确保了代码的安全性和确定性,避免了因多个实现而导致的歧义和冲突。以下是一些关于 Trait 一致性的具体例子和解释:
1. Trait 实现的冲突
在 Rust 中,如果有两个不同的实现针对同一个类型和同一个 Trait,那么这将违反一致性规则,导致编译错误。例如:
trait Even {
fn is_even(self) -> bool;
}impl<T> Even for T
where
T: Rem<Output = T> + PartialEq<T> + Sized,
u8: TryInto<T>,
<u8 as TryInto<T>>::Error: Debug,
{
fn is_even(self) -> bool {
self % 2.try_into().unwrap() == 0.try_into().unwrap()
}
}impl Even for u8 { // ❌
fn is_even(self) -> bool {
self % 2_u8 == 0_u8
}
}
这段代码会抛出错误,因为 u8
类型有两个不同的 Even
Trait 实现,这违反了一致性规则。
2. Subtraits & Supertraits
Trait 一致性还涉及到子 Trait(Subtraits)和超 Trait(Supertraits