如何缩短 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>;
典型用例是
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>;