У меня есть вектор Unit
s. Я пытаюсь создать переменную Vec<Vec<Unit>>
с именем world
. В процессе создания плиток мне нужно знать, какие плитки являются соседними, о которых он знает.
У меня есть функция, которая возвращает вектор точек ((usize, usize)
), смежных с другой точкой, и я преобразовываю его в итератор, сопоставляю его и получаю фактическую единицу, связанную с этой позицией в world
, если она там есть, или текущая строка, которая еще не была зафиксирована в world
.
Мне нужно получить доступ к этой строке внутри замыкания, которое принимает map
, но мне также нужно получить к ней доступ позже.
fn adjacent((x, y): (usize, usize)) -> Vec<(usize, usize)> {
vec![
(x+1, y),
(x-1, y),
(x, y+1),
(x, y-1),
]
}
struct Unit {
pub tiles: Vec<Tile>,
}
#[derive(Copy, Clone)]
enum Tile {
Floor, Wall, Empty
}
fn main() {
let heightmap = vec![
vec![3, 3, 3, 3, 3, 3],
vec![3, 1, 1, 1, 1, 3],
vec![3, 1, 1, 1, 1, 3],
vec![3, 1, 1, 1, 1, 3],
vec![3, 1, 1, 1, 1, 3],
vec![3, 1, 1, 1, 1, 3],
vec![3, 3, 3, 3, 3, 3],
];
let (sx, sy) = (5, 5);
let mut world: Vec<Vec<Unit>> = vec![];
for y in 0..sy {
let mut line: Vec<Unit> = vec![];
for x in 0..sx {
let mut tiles: Vec<Tile> = vec![];
let height = heightmap[y][x];
let adj = adjacent((x, y))
.iter()
.map(|&(x, y)| {
let list = if y > world.len() {
vec![]
} else if y == world.len() {
line
} else {
world[y]
};
if x >= list.len() {
Tile::Empty
} else {
if height as usize >= list[x].tiles.len() {
Tile::Empty
} else {
list[x].tiles[height as usize]
}
}
})
.collect::<Vec<_>>();
for z in 0..(height as isize - 1) {
tiles.push(Tile::Wall);
}
line.push(Unit {
tiles: tiles,
});
}
world.push(line);
}
}
Я бы предпочел использовать unwrap_or
в сочетании с get
и так далее, но это приводит к другим ошибкам с временными значениями, и в любом случае это было бы сложнее, поэтому приведенный выше код, хотя, вероятно, и не оптимален, настолько прост, насколько я могу понять, пока все еще дублирует ошибку. Я обнаружил, что многие ошибки, которые я получаю с Rust, связаны с тем, что то, что я делаю, - не лучший способ сделать это, поэтому, если есть более идиоматический способ, я, безусловно, хотел бы знать.
Я пытался сделать Unit
клонируемым (получив Clone
и Copy
), но Rust по какой-то причине не позволяет мне это сделать, хотя все, из чего он состоит, — это векторы, которые можно клонировать, если их элементы клонируются.