在 Rust 中是否有任何等效于 JavaScript 的 forEach?

迈森

如何改进此功能:

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 中是否有等价物?

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

彼得·霍尔

为了改变现有的数据结构,使用显式循环是最惯用的方法:

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);
            }
        })
});

无论您使用哪个,您绝对不应该收集到所有那些Vec然后扔掉的 s 中。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

是否有等效于JavaScript的Rust数组的indexOf?

是否有Rust等效于C ++中的clock函数?

javascript 中是否有等效于 Func<T> 或更好的 ActionBlock ?

数组的JavaScript传播运算符的Rust等效于什么?

什么与Rust中JavaScript的DataView等效?

Rust是否具有等效于C的typedef?

标准库中是否有等效于Rust的`std :: mem :: drop`的C ++?

Rust中是否有一个等效于Java的Stream.Iterate的函数?

javascript中的递归forEach()

javascript中是否有与ruby等效的任何方法?

C ++中是否有任何等效于python中字典的get函数的函数?

Rust中是否有类似JavaScript的substr的方法?

Dart 中是否有等效于 Javascript 的 `resolve` 函数(来自 Promise 构造函数)?

Rust 等效于 2D 矢量迭代器上的 Javascript 映射

带有 DOM 的 javascript foreach

Rust是否等效于具有相同泛型参数约束的Swift扩展方法?

是否等效于Javascript中“ window”的“ element.scrollHeight”?

JavaScript中的Thymeleaf forEach循环

在 ForEach 中更新 javascript 对象?

Rust是否等效于Swift的协议扩展方法?

C ++是否等效于Rust的Result <T,E>类型?

ForEach 内部的 Foreach Javascript

Rust 是否有类似 Java 中的等效 Stream 类?

JavaScript forEach()

等效于C ++ for Rust中特定模板的用法

是否有任何等效于c ++的mach / mach_time.h库

是否有任何等效于vue cli的npx create react应用程序?

python是否等效于Javascript的“ btoa”

C#是否等效于JavaScript的encodeURIComponent()?