我设法使其工作(参见下面的示例),但这需要数组的多次迭代.

有没有办法让向量只迭代一次?

struct Vx {
    pub a: f32,
    pub b: f32,
}

fn main() {
    let mut varr = Vec::new();
    varr.push(Vx { a: 0., b: 0. });
    varr.push(Vx { a: 1., b: 1. });
    varr.push(Vx { a: 2., b: 2. });

    let a: Vec<f32> = varr.iter().map(|v| v.a).collect();
    let b: Vec<f32> = varr.iter().map(|v| v.b).collect();

    println!("a: {:?}", a);
    println!("b: {:?}", b);
}

推荐答案

map+unzip只适用于两个字段,但对于任意数量的字段,您始终可以使用更通用的fold并解压缩成任何类型的 struct :

struct Vx {
    pub a: f32,
    pub b: f32,
    pub c: f32,
}

fn main() {
    let mut varr = Vec::new();
    varr.push(Vx {
        a: 0.,
        b: 0.,
        c: 1.,
    });
    varr.push(Vx {
        a: 1.,
        b: 1.,
        c: 2.,
    });
    varr.push(Vx {
        a: 2.,
        b: 2.,
        c: 3.,
    });

    let len = varr.len();
    let (a, b, c) = varr.iter().fold(
        (
            Vec::with_capacity(len),
            Vec::with_capacity(len),
            Vec::with_capacity(len),
        ),
        |(mut a, mut b, mut c), v| {
            a.push(v.a);
            b.push(v.b);
            c.push(v.c);
            (a, b, c)
        },
    );

    println!("a: {:?}", a); // a: [0.0, 1.0, 2.0]
    println!("b: {:?}", b); // b: [0.0, 1.0, 2.0]
    println!("c: {:?}", c); // c: [1.0, 2.0, 3.0]
}

Rust相关问答推荐

在没有引用计数或互斥锁的情况下,可以从Rust回调函数内的封闭作用域访问变量吗?

Rust 的多态现象.AsRef与Derf

关于 map 闭合求和的问题

无法实现整型类型的泛型FN

你能在Rust中弃用一个属性吗?

考虑到Rust不允许多个可变引用,类似PyTorch的自动区分如何在Rust中工作?

如何执行数组文字的编译时串联?

部署Rust发布二进制文件的先决条件

如何将 &[T] 或 Vec<T> 转换为 Arc<Mutex<[T]>>?

没有明确地说return会产生错误:match arms have incompatible types

pyO3 和 Panics

使用 lalrpop 在 rust 中解析由 " 引用的字符串

按下 Ctrl + C 时优雅地停止命令并退出进程

Rust/Serde/HTTP:序列化`Option`

返回引用字符串的future

在 RefCell 上borrow

通用函数中的生命周期扣除和borrow (通用测试需要)

有没有办法使用 NASM 语法进行内联汇编?

Rust 生命周期:不能在方法内重新borrow 可变字段

为什么我不能将元素写入 Rust 数组中移动的位置,但我可以在元组中完成