[英]How to inject a stub for a trait object into a type in Rust and keep a reference to it?
[英]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>;
}
或者,作为 hack,您可以尝试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;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.