在Rust中有没有相当于JavaScript的forEach?

问题描述 投票:-3回答:1

我该如何改进这个功能:

use std::{env, process::exit};

fn get_grid() -> [[u8; 9]; 9] {
    let mut grid: [[u8; 9]; 9] = Default::default();
    let mut args: Vec<String> = env::args().collect();
    if args.len() != 10 {
        eprintln!("This program need 9 strings of 9 numbers between 0 and 9");
        exit(1);
    }
    args.remove(0);
    let _: Vec<_> = args
        .iter()
        .enumerate()
        .map(|(i, arg)| {
            let _line: Vec<_> = arg
                .split(' ')
                .enumerate()
                .map(|(j, value)| match value.parse() {
                    Ok(x) => {
                        grid[i][j] = x;
                        x
                    }
                    Err(e) => {
                        eprintln!("Value {} is not a valid integer [{}]", value, e);
                        exit(1);
                    }
                })
                .collect();
        })
        .collect();
    return grid;
}

据我所知,.map()将在收集时构建一个新的可迭代(Vec)并返回它。我不需要这个迭代,我只想修改一个外部数组,而不是从这个迭代构建任何东西。

在JavaScript中,有.map,但也有.forEach迭代map并且什么都不返回。 Rust中有没有相应的东西?

我可能只是使用for (index, value) in args.iter().enumerate()但我正在寻找避免显式循环的方法,如果有的话。

loops rust iterator
1个回答
3
投票

对于改变现有数据结构,使用显式循环是最常用的方法:

for (i, arg) in args.iter().enumerate() {
    for (j, value) in arg.split(' ').enumerate() {
        match value.parse() {
            Ok(x) => {
                grid[i][j] = x;
            }
            Err(e) => {
                eprintln!("Value {} is not a valid integer [{}]", value, e);
                exit(1);
            }
        }
    }
}

您可以使用Iterator::for_each编写此代码,但大多数Rust开发人员不太可能认为它“更好”:

args.iter().enumerate().for_each(|(i, arg)| {
    arg.split(' ')
        .enumerate()
        .for_each(|(j, value)| match value.parse() {
            Ok(x) => {
                grid[i][j] = x;
            }
            Err(e) => {
                eprintln!("Value {} is not a valid integer [{}]", value, e);
                exit(1);
            }
        })
});

无论你使用哪种,你绝对不应该收集你扔掉的所有那些Vecs。

© www.soinside.com 2019 - 2024. All rights reserved.