Я хочу перебрать позиции (x, y)
в двумерной сетке и вызвать функцию для каждой позиции (предоставляя x
и y
в качестве параметров).Я знаю, как это можно сделать с помощью циклов for
, но я хотел бы написать это с использованием методов функционального программирования, чтобы впоследствии я мог воспользоваться библиотеками, такими как Rayon.Мне удалось создать функциональную версию, но она кажется сложной и я хотел спросить, есть ли более чистый способ добиться этого.
Вот небольшой пример вычисления максимальной суммы всех патчей 2x2 в сетке.:
use std::cmp::max;
const WIDTH: usize = 4;
const HEIGHT: usize = 3;
type Grid = [[u32; WIDTH]; HEIGHT];
fn main() {
let grid: Grid = [
[1, 3, 5, 8],
[3, 9, 4, 2],
[3, 4, 5, 0],
];
let coords = (0..WIDTH - 1).flat_map(|x| (0..HEIGHT - 1).map(move |y| (x, y)));
let max_sum = coords.map(|(x, y)| sum_2x2(x, y, &grid)).max().unwrap();
println!("Max 2x2 patch: {}", max_sum);
}
fn sum_2x2(x: usize, y: usize, grid: &Grid) -> u32 {
[
grid[y][x],
grid[y][x + 1],
grid[y + 1][x],
grid[y + 1][x + 1],
]
.iter()
.sum()
}
Строка let coords = let coords = (0..WIDTH - 1).flat_map(|x| (0..HEIGHT - 1).map(move |y| (x, y)));
кажется довольно сложной для такой простой задачи.В Python я бы сделал следующее, чтобы получить позиции (которые я считаю намного чище):
>>> from itertools import product
>>> product(range(HEIGHT-1), range(WIDTH-1))
Есть ли лучший способ написать это, или мне просто нужно привыкнуть к нему?