【发布时间】:2020-10-06 13:39:30
【问题描述】:
假设我们有一个点向量,写成一个扁平的整数序列。向量的大小是精确的,我们希望将其转换为 Point 结构的向量。所以我的转换目前看起来是这样的。
#[derive(Debug)]
struct Point {
x: i32,
y: i32,
}
impl Point {
fn new(x: i32, y : i32) -> Point {
Point{x,y}
}
}
impl From<Point> for String {
fn from(point: Point) -> String {
format!("({},{})", point.x, point.y)
}
}
fn main() {
let vec = vec![2,1,4,3,6,5]; // We want convert that
let even = vec.iter().step_by(2);
let odd = vec.iter().skip(1).step_by(2);
let points: Vec<Point>
= even.zip(odd)
.map(|(x,y)|Point::new(*x,*y))
.collect();
println!("{:?}", points);
}
像一个魅力一样工作,直到我们想要添加z 组件,并在每个循环中查看三个元素。我还没有从docs 找到任何合适的方法。那么,是否已经有一种通用的方法可以在向量上迭代一定大小的切片并将其解压缩到我的结构中,或者没有这种方法,我应该自己实现这样的迭代器?使用像serde 这样更重的机器是不是一个信号。
【问题讨论】:
-
itertools有一个支持两个以上元素的zipequivalent。这就是你要找的东西吗? -
@mcarton 可能。看不懂例子。 izip 的整体文档很差。主要问题我可以在没有外部板条箱的情况下做到这一点,只有
std -
“我可以在没有外部 crates 的情况下做到吗,只有
std”通常是错误的思考方式。 Rust 的标准库故意很小,itertools是一个广泛使用的 crate。 -
@mcarton 不是真的。如果我可以用我已经拥有的工具做点什么,我就不需要额外的板条箱来膨胀我的二进制文件。所以,这正是问题所在——我需要外部的东西还是开箱即用的东西。另外,寻找合适的箱子很困难,但现在我知道
itertools,谢谢你
标签: rust data-conversion iterable