如何允许在各种类型的 IntoIterator 项上多次实现同一个特征?

问题描述 投票:0回答:2

Rust 似乎仅在关联类型不同时才区分特征的不同实现。

如何在各种集合/迭代器上实现方法,但又为它们包含的每个具体类型提供特定的实现?

错误:特征的实现冲突

Foo
[E0119]

代码

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();
}
iterator rust traits
2个回答
6
投票

您不能直接填写通用表格,即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
{
    ...
}

0
投票

以下是如何在 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();
}
© www.soinside.com 2019 - 2024. All rights reserved.