Rust:特征中的类型引用
Rust: type reference within trait
我想实现我自己的通用容器,这是我正在使用的特征的片段:
pub trait MyVec
where
Self: Default + Clone + IntoIterator,
Self: std::iter::FromIterator<<Self as IntoIterator>::Item>,
{
fn get(self: &Self, index: usize) -> <Self as IntoIterator>::Item;
// many other methods are omitted.
}
是否可以引入一个新的计算类型变量,这样我就可以避免在任何地方输入 <Self as IntoIterator>::Item
?一个简单的 type Item = <Self as IntoIterator>::Item
不起作用,因为它是一个可能被覆盖的关联类型。将类型参数用作 MyVec<I>
也不起作用,因为我不想为同一结构使用不同的 I
类型来实现此特征,并且在以后编写通用代码时也会导致问题。有什么建议吗?
我不认为您可以在 trait
中定义一个 type
作为实现者然后可以自定义此类型。
但是你可以在特征之外引入一个类型别名:
pub type IntoIterItem<T> = <T as IntoIterator>::Item;
pub trait MyVec :
Default
+ Clone
+ IntoIterator
+ std::iter::FromIterator<IntoIterItem<Self>>
{
fn get(self: &Self, index: usize) -> IntoIterItem<Self>;
}
或者,作为黑客,您可以尝试 MyVec<I>
,但使用默认值 I
:
pub trait MyVec<Item=<Self as IntoIterator>::Item> :
Default
+ Clone
+ IntoIterator
+ std::iter::FromIterator<Item>
{
fn get(self: &Self, index: usize) -> Item;
}
我想实现我自己的通用容器,这是我正在使用的特征的片段:
pub trait MyVec
where
Self: Default + Clone + IntoIterator,
Self: std::iter::FromIterator<<Self as IntoIterator>::Item>,
{
fn get(self: &Self, index: usize) -> <Self as IntoIterator>::Item;
// many other methods are omitted.
}
是否可以引入一个新的计算类型变量,这样我就可以避免在任何地方输入 <Self as IntoIterator>::Item
?一个简单的 type Item = <Self as IntoIterator>::Item
不起作用,因为它是一个可能被覆盖的关联类型。将类型参数用作 MyVec<I>
也不起作用,因为我不想为同一结构使用不同的 I
类型来实现此特征,并且在以后编写通用代码时也会导致问题。有什么建议吗?
我不认为您可以在 trait
中定义一个 type
作为实现者然后可以自定义此类型。
但是你可以在特征之外引入一个类型别名:
pub type IntoIterItem<T> = <T as IntoIterator>::Item;
pub trait MyVec :
Default
+ Clone
+ IntoIterator
+ std::iter::FromIterator<IntoIterItem<Self>>
{
fn get(self: &Self, index: usize) -> IntoIterItem<Self>;
}
或者,作为黑客,您可以尝试 MyVec<I>
,但使用默认值 I
:
pub trait MyVec<Item=<Self as IntoIterator>::Item> :
Default
+ Clone
+ IntoIterator
+ std::iter::FromIterator<Item>
{
fn get(self: &Self, index: usize) -> Item;
}