Я пытаюсь реализовать поиск A * Advent of Code 2019 (да, Slowpoke, я знаю). Я начал так:
fn find_path(start: Coords, goal: Coords, map: &Vec<Vec<char>>) -> Vec<Coords> {
struct Node {
distance: u32,
pos: Coords,
}
impl PartialEq for Node {
fn eq(&self, other: &Self) -> bool {
self.distance + manhattan(self.pos, goal) == other.distance + manhattan(other.pos, goal)
}
}
...
let mut edge = BinaryHeap::new();
edge.push(Node{distance: 0, pos: start});
...
Coords
- это структура с x
и y
. Проблема здесь в том, что я не могу использовать goal
в признаке, потому что это не входит в сферу. Замыкание сможет захватить его, но я сомневаюсь, что смогу использовать здесь вместо fn
. Если так, какой синтаксис? Если нет, есть ли фундаментальная причина, почему это не может быть сделано? Я не смог найти ответ в Интернете.
Я знаю, что простое решение - включить goal
в Node
, но это излишне, потому что я буду создавать тысячи Node
во время A * , все из которых будут иметь одну и ту же цель, тратя память и циклы процессора. В принципе, goal
может быть единственной глобальной переменной, но это неопрятный вариант.
Несмотря на то, что я уверен, что включение goal
в Node
будет работать на практике, я бы не стал .
Есть ли другой идиоматический c способ выполнить то, что я пытаюсь сделать?