Rust 似乎仅在关联类型不同时才区分特征的不同实现。
如何在各种集合/迭代器上实现方法,但又为它们包含的每个具体类型提供特定的实现?
错误:特征的实现冲突
[E0119]Foo
代码:
trait Foo { fn foo(self); }
impl<T> Foo for T
where T: IntoIterator<Item=u32>
{
fn foo(self) {
self.into_iter();
}
}
impl<T> Foo for T
where T: IntoIterator<Item=u16>
{
fn foo(self) {
self.into_iter();
}
}
fn main() {
vec![0u32].foo();
vec![0u16].foo();
}
您不能直接填写通用表格,即issue #20400。您必须引入一个可以用作
T::Item
绑定的特征来合并两个实现,或者引入包装类型。例如。第一个可能看起来像:
trait FooIterItem {
// behaviours needed for Foo impl
}
impl FooIterItem for u32 { ... }
impl FooIterItem for u16 { ... }
impl<T> Foo for T
where T: IntoIterator, T::Item: FooIterItem
{
...
}
以下是如何在 disjoint_impls 宏的帮助下轻松完成此操作:
use disjoint_impls::disjoint_impls;
disjoint_impls! {
trait Foo { fn foo(self); }
impl<T> Foo for T
where T: IntoIterator<Item=u32>
{
fn foo(self) {
self.into_iter();
}
}
impl<T> Foo for T
where T: IntoIterator<Item=u16>
{
fn foo(self) {
self.into_iter();
}
}
}
fn main() {
vec![0u32].foo();
vec![0u16].foo();
}