Rust 在某个连续容器上迭代大小为N的片

Rust 在某个连续容器上迭代大小为N的片,rust,data-conversion,iterable,Rust,Data Conversion,Iterable,假设我们有一个点向量,它被写成一个平面整数序列。向量的大小是精确的,我们希望将其转换为点结构的向量。所以我的转换现在看起来像这样 #[派生(调试)] 结构点{ x:i32, y:i32, } 内点{ fn新(x:i32,y:i32)->点{ 点{x,y} } } 字符串的impl From{ fn from(点:点)->字符串{ 格式!(“({},{})”,点.x,点.y) } } fn main(){ 让vec=vec![2,1,4,3,6,5];//我们要转换它 设偶数=vec.iter()

假设我们有一个点向量,它被写成一个平面整数序列。向量的大小是精确的,我们希望将其转换为
结构的向量。所以我的转换现在看起来像这样

#[派生(调试)]
结构点{
x:i32,
y:i32,
}
内点{
fn新(x:i32,y:i32)->点{
点{x,y}
}
}
字符串的impl From{
fn from(点:点)->字符串{
格式!(“({},{})”,点.x,点.y)
}
}
fn main(){
让vec=vec![2,1,4,3,6,5];//我们要转换它
设偶数=vec.iter()。步进(2);
设奇数=vec.iter()。跳过(1)。步进(2);
让点:Vec
=偶数.zip(奇数)
.map(|(x,y)|点::新(*x,*y))
.收集();
println!(“{:?}”,点);
}

就像一个符咒,直到我们想要添加
z
组件,并在每个周期中查看三个元素。我还没有从中找到任何合适的方法。那么,是否已经有一种通用的方法可以在向量上迭代某些大小的切片并将其解压到我的结构中,或者没有这种方法,我应该自己实现这种迭代器?这是一个信号,使用一些较重的机械,如
serde

我认为没有一个预先完成的方法,但您可以很容易地编写代码,可以很快地调整以包含第三个
z
组件,类似于此():

#[派生(调试,默认)]
结构点生成器{
x:选项,
y:选择,
//在这里加一个z
}
impl指针生成器{
fn添加(&mut self,值:i32){
如果self.x.为_none(){
self.x=一些(值);
}否则,如果self.y.是_none(){
self.y=一些(值);
}
//在这里加一个z
}
fn try_build(&self)->选项{
//这个匹配表达式中的最后一个z
匹配(self.x,self.y){
(一些(x),一些(y))=>一些(点::新的(x,y)),
_=>没有,
}
}
}
fn将_转换为_点(数据:impl into迭代器)->Vec{
数据输入到_iter()
.fold((PointBuilder::default(),Vec:::new()),|(mut builder,mut points),value |{
增加(价值);
如果让一些(点)=构建器。请尝试构建(){
点。推(点);
(PointBuilder::default(),点)
}否则{
(建筑商,积分)
}
})
1.
}
fn main(){
让vec=vec![2,1,4,3,6,5];//我们要转换它
let points=将_转换为_点(vec);
println!(“{:?}”,点);
}

如果您需要几十个结构,这当然可以作为proc宏派生代码生成器来完成,但我不知道有任何库已经实现了这一点,因此这取决于您的用例是否值得付出努力。

我认为没有一个预先完成的方法,但是您可以很容易地编写代码,这些代码可以很快地进行调整,以包含第三个
z
组件,类似于此():

#[派生(调试,默认)]
结构点生成器{
x:选项,
y:选择,
//在这里加一个z
}
impl指针生成器{
fn添加(&mut self,值:i32){
如果self.x.为_none(){
self.x=一些(值);
}否则,如果self.y.是_none(){
self.y=一些(值);
}
//在这里加一个z
}
fn try_build(&self)->选项{
//这个匹配表达式中的最后一个z
匹配(self.x,self.y){
(一些(x),一些(y))=>一些(点::新的(x,y)),
_=>没有,
}
}
}
fn将_转换为_点(数据:impl into迭代器)->Vec{
数据输入到_iter()
.fold((PointBuilder::default(),Vec:::new()),|(mut builder,mut points),value |{
增加(价值);
如果让一些(点)=构建器。请尝试构建(){
点。推(点);
(PointBuilder::default(),点)
}否则{
(建筑商,积分)
}
})
1.
}
fn main(){
让vec=vec![2,1,4,3,6,5];//我们要转换它
let points=将_转换为_点(vec);
println!(“{:?}”,点);
}

如果您需要几十个结构,这当然可以作为proc宏派生代码生成器来完成,但我不知道有任何库已经实现了这一点,因此这取决于您的用例是否值得付出努力。

在std中使用它很容易

#[派生(调试)]
结构点{
x:i32,
y:i32,
z:i32,
}
内点{
fn新(x:i32,y:i32,z:i32)->点{
点{x,y,z}
}
}
fn main(){
设vec=vec![2,1,4,3,6,5];
让点:Vec
=vec.chunks\u精确(3)
.map(| chunk | Point::new(chunk[0]、chunk[1]、chunk[2]))
.收集();
println!(“{:?}”,点);
}

在std中,使用

#[派生(调试)]
结构点{
x:i32,
y:i32,
z:i32,
}
内点{
fn新(x:i32,y:i32,z:i32)->点{
点{x,y,z}
}
}
fn main(){
设vec=vec![2,1,4,3,6,5];
让点:Vec
=vec.chunks\u精确(3)
.map(| chunk | Point::new(chunk[0]、chunk[1]、chunk[2]))
.收集();
println!(“{:?}”,点);
}

itertools
具有支持两个以上元素的。这就是你要找的吗?@mcarton可能。我不懂这个例子。izip的总体文档很差。主要问题是没有外部板条箱我能做吗,只有
std
“没有外部板条箱我能做吗,只有
std
”通常是错误的想法。Rust的标准库很小,而且
itertools
是一个广泛使用的板条箱。@mcarton不是真的。如果我能用我已有的工具做点什么,我就不需要额外的板条箱来填满二进制文件。所以,这正是问题所在