rust - Rust:特征中的类型引用
问题描述
我想实现我自己的通用容器,这是我正在使用的特征的片段:
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
不起作用,因为它是可能被覆盖的关联类型。使用类型参数 asMyVec<I>
也不起作用,因为我不想I
为同一个结构用不同类型实现这个特征,并且在以后编写通用代码时也会导致问题。有什么建议吗?
解决方案
我认为您不能type
在trait
as 实现者中定义 a 然后可以自定义此类型。
但是你可以在特征之外引入一个类型别名:
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;
}
推荐阅读
- eclipse - 尝试从当前的过去 5 个工作日内在 android 应用程序中自动化 1 个测试场景(跳过周六、周日、固定假期)
- python-3.x - 使用 numpy 从数组创建矩阵
- google-cloud-platform - Gcloud 将图像推送到错误/旧项目
- python - 错误:无法导入“flask_sqlalchemy”
- swift - 如何修复无法从 Core Data 获取图像的错误?
- r - 是否可以更改 semPaths 中箭头的长度/位置?
- c++ - 在 Windows 上导致问题的 active-win npm 包,一般如何解决依赖问题,npm?
- python - 在 Python 中绘制频谱图(频率与时间)
- python - 将 Pandas DataFrame 转换为单行 DataFrame,将一列的值保存为标题
- c# - 我将如何制作一个返回数据的函数