我希望 struct 的字段是Iterator除以T个元素,但是Iterator没有类型参数.我知道我正试图做一些根本错误的事情,但是呢?

推荐答案

在Rust中,Iterator(更具体地说是Iterator<Item = T>,其中T是迭代时产生的类型)是trait.表示迭代器的类型实现了这个特性.

这是一个更一般的问题"如何在 struct 中存储特征值?"的实例.我故意用一种不精确的方式来表达这个问题——我们真正想要的是存储一个type implementing the trait的值,大致有两种方法.

Put it in a box

最简单的方法是使用Box<Iterator<Item = T>>.Box代表一个拥有的指针,当您有一个指向trait对象的指针时,Rust会创建一个"胖指针",其中包含有关该类型的运行时信息.这样在编译时就不知道迭代器的具体类型.

定义如下:

struct IteratorHolder {
    iter: Box<Iterator<Item = u32>>,
}

用法:

let ih = IteratorHolder { iter: Box::new(0..10) };
println!("{:?}", ih.iter.collect::<Vec<_>>());

Generics

另一种做同样事情的方法是使用通用 struct ,同时避免在堆上分配任何框.这样我们将有一些类型实现Iterator<Item = T>,具体是什么将在编译时确定.

定义:

struct IteratorHolder<I: Iterator<Item = u32>> {
    iter: I,
}

用法:

let ih = IteratorHolder { iter: 0..10 };
println!("{:?}", ih.iter.collect::<Vec<_>>());

Rust相关问答推荐

使用Rust s serde_json对混合数据类型进行优化'

交叉术语未正确清除屏幕

在Rust中,有没有一种方法让我定义两个 struct ,其中两个都遵循标准 struct ?

何时可以在Rust中退出异步操作?

如何指定不同的类型来常量Rust中的泛型参数?

铁 rust 中的共享对象实现特征

Rust类似功能是C++命名空间吗?

有没有可能让泛型Rust T总是堆分配的?

用于判断整数块是否连续的SIMD算法.

Tokio';s io::用Cursor拆分<;Vec<;u8>>;赢得';t get the full writted data

Const 上下文:从 init 函数创建具有 const 通用长度的数组

使用 Option 来分配?

为什么需要同时为值和引用实现`From`?方法不应该自动解引用或borrow 吗?(2023-06-16)

在给定 Rust 谓词的情况下,将 Some 转换为 None 的惯用方法是什么?

如何使用泛型满足 tokio 异步任务中的生命周期界限

为什么1..=100返回一个范围而不是一个整数?

在 Rust 中为泛型 struct 编写一次特征绑定

隐式类型闭包的错误生命周期推断

有没有更好的方法来为拥有 DIsplay 事物集合的 struct 实现 Display?

如何在没有 `make_contiguous()` 的情况下对 VecDeque 进行排序或反转?