rust - 在一些连续的容器上迭代大小为 N 的切片

标签 rust data-conversion iterable

假设我们有一个点向量,写成整数的平面序列。矢量的大小是精确的,我们想将其转换为 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 中找到任何合适的方法.那么,是否已经有一种通用的方法可以在 vector 上迭代一定大小的切片并将其解压缩到我的结构中,或者没有这样的方法,我应该自己实现这样的迭代器?它是否是使用一些较重的机器(如 serde)的信号。

最佳答案

在 std 中使用 chunks_exact 很容易对切片进行操作.

#[derive(Debug)]
struct Point {
    x: i32,
    y: i32,
    z: i32,
}
impl Point {
    fn new(x: i32, y : i32, z: i32) -> Point {
        Point{x,y, z}
    }
}

fn main() {
    let vec = vec![2,1,4,3,6,5];
    let points: Vec<Point> 
                = vec.chunks_exact(3)
                .map(|chunk|Point::new(chunk[0], chunk[1], chunk[2]))
                .collect();

    println!("{:?}", points);
}

关于rust - 在一些连续的容器上迭代大小为 N 的切片,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64227040/

相关文章:

python - 转换已存在的二进制文件的字节序类型

python - 如何将十六进制转换为 IEEE float python

javascript - 为什么我们必须用 [Symbol.iterator] 定义 Symbol.iterator ? javascript 中的可迭代对象?

java - 将多个 json 结果转换为可迭代

c# - 将十进制(用户字符串)转换为带有 0x 前缀的十六进制

python - 需要 : simple way to force json to decode to "normal" iterable python lists

rust - 如何匹配 Rust 中的数据类型?

arrays - 自动将 Vec 转换为数组

rust - 有什么方法可以将迭代器解包到元组中吗?

rust - Trait Object is not Object-safe 错误