如何缩短 IntoIterator<Item=MyComplexType>

How to shorten IntoIterator<Item=MyComplexType>

典型用例是

fn process_items(items: impl IntoIterator<Item=MyComplexType>) {...}

我想知道这是否可以缩短为

fn process_items(items: impl ItemsIter) {...}

然而

type ItemsIter = IntoIterator<Item=MyComplexType>

不工作和辅助特征

trait ItemsIter: IntoIterator<Item=MyComplexType> {}

需要全面实施。有没有更好的方法?

您可以为 MyComplexType 创建一个类型别名,并创建一个 where 子句以将特征绑定移出函数参数列表,例如

type MyAlias = MyComplexType;

fn process_items<I>(items: I)
where
    I: IntoIterator<Item = MyAlias>
{...}

如果您经常需要此特征绑定,您还可以创建一个具有所需特征绑定的自定义特征,并为其提供一揽子实现:

trait MyIterator: IntoIterator<Item = MyComplexType> {}
impl<T: IntoIterator<Item = MyComplexType>> MyIterator for T {}

fn process_items(items: impl MyIterator) {...}

(您在问题中提到了这一点;我认为这种方法没有任何问题。)

除了其他答案外,请注意制作“trait alias”的能力确实存在,但不稳定。如果你喜欢夜间使用不稳定的功能,你可以这样做

#![feature(trait_alias)]

pub struct MyComplexType;

trait MyComplexIterator = IntoIterator<Item = MyComplexType>;

(Playground link)