Rust 我如何拥有一个struct';s字段是否是'T'元素上的'Iterator'?
我希望结构的字段是Rust 我如何拥有一个struct';s字段是否是'T'元素上的'Iterator'?,rust,Rust,我希望结构的字段是T元素上的Iterator,但是Iterator没有类型参数。我知道我试图做一些根本错误的事情,但是呢?在Rust中,Iterator(更具体地说是Iterator,其中T是迭代时产生的类型)是一种特征。表示迭代器的类型实现了这个特性 这是一个更一般的问题“如何在结构中存储特征值?”。我故意用一种不精确的方式来表达这个问题——我们实际上想要的是存储实现这个特性的类型的值,大致有两种方法 把它放在盒子里 最简单的方法是使用框。框表示一个拥有的指针,当您有一个指向trait对象的指
T
元素上的Iterator
,但是Iterator
没有类型参数。我知道我试图做一些根本错误的事情,但是呢?在Rust中,Iterator
(更具体地说是Iterator
,其中T
是迭代时产生的类型)是一种特征。表示迭代器的类型实现了这个特性
这是一个更一般的问题“如何在结构中存储特征值?”。我故意用一种不精确的方式来表达这个问题——我们实际上想要的是存储实现这个特性的类型的值,大致有两种方法
把它放在盒子里
最简单的方法是使用框
。框
表示一个拥有的指针,当您有一个指向trait对象的指针时,Rust会创建一个“胖指针”,其中包含有关该类型的运行时信息。这样,迭代器的具体类型在编译时是未知的
定义如下:
struct IteratorHolder {
iter: Box<Iterator<Item = u32>>,
}
struct IteratorHolder{
国际热核实验堆:盒子,
}
使用方法:
let ih = IteratorHolder { iter: Box::new(0..10) };
println!("{:?}", ih.iter.collect::<Vec<_>>());
let ih = IteratorHolder { iter: 0..10 };
println!("{:?}", ih.iter.collect::<Vec<_>>());
let ih=IteratorHolder{iter:Box::new(0..10)};
普林顿!(“{:?}”,ih.iter.collect::());
仿制药
做同样事情的另一种方法是使用泛型结构,同时避免在堆上分配任何框。这样我们将有一些类型实现迭代器
,具体是什么将在编译时确定
定义:
struct IteratorHolder<I: Iterator<Item = u32>> {
iter: I,
}
struct IteratorHolder{
国际热核实验堆:我,
}
使用方法:
let ih = IteratorHolder { iter: Box::new(0..10) };
println!("{:?}", ih.iter.collect::<Vec<_>>());
let ih = IteratorHolder { iter: 0..10 };
println!("{:?}", ih.iter.collect::<Vec<_>>());
let ih=IteratorHolder{iter:0..10};
普林顿!(“{:?}”,ih.iter.collect::());