rust - 我如何让结构的字段成为 `Iterator` 超过 `T` 元素?

标签 rust

我希望结构的字段是T 元素上的Iterator,但是Iterator 没有类型参数。我知道我正在尝试做一些根本错误的事情,但是呢?

最佳答案

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

这是更普遍的问题“如何在结构中存储特征值?”的一个实例。我故意以一种不精确的方式表达了这个问题——我们真正想要的是存储一个实现特征的类型的值,并且有两种方法可以做到这一点。

放在盒子里

最简单的方法是使用 Box<Iterator<Item = T>> . Box代表一个拥有的指针,当你有一个指向特征对象的指针时,Rust 会创建一个“胖指针”,包括有关该类型的运行时信息。这样迭代器的具体类型在编译时是未知的。

定义如下:

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

和用法:

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

泛型

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

定义:

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

和用法:

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

关于rust - 我如何让结构的字段成为 `Iterator` 超过 `T` 元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47838596/

相关文章:

rust - 是否不可能对使用智能指针(如 Box、Rc 或 Arc)的递归数据类型进行嵌套匹配?

rust - 如何在 Relm View 中设置图标!宏?

rust - 如何改变移动传递的参数?

rust - 存储具有相同特征和不同输出类型的结构

rust - 如何在Rust中解决此返回类型函数错误

rust - 有没有一种方法可以为所有引用类型的迭代器通用地实现一个特征?

rust - 为什么 Rust 不能使用 const 作为文字?

rust - 定义结构时如何从特征使用常量?

macros - 当内部宏接受参数时,如何定义一个定义另一个宏的宏?

rust - 如何为我不拥有的类型实现我不拥有的特征?