Обмен 2 Ve c свойств от объекта, на который ссылаются, в Rust - PullRequest
0 голосов
/ 05 марта 2020

В моей реализации игры жизни Конвея в Rust я столкнулся с проблемой. Я хочу вспомнить предыдущее состояние мира. Для этого я создал дополнительное свойство в моей Universe структуре, которая теперь выглядит следующим образом:

pub struct Universe {
    width: usize,
    height: usize,
    cells: Vec<Cell>,
    previous_cells: Option<Vec<Cell>>,
}

Option есть, потому что при инициализации нет предыдущего состояния.

Моя идея заключается в том, что на каждом тике мы записываем новое состояние в вектор с предыдущим состоянием. В конце я меняю векторы. Это привело к следующему коду:

pub fn tick(&mut self) {
    // get the previous state or create new one if it doesn't exist (i.e. this is the first tick/update)
    let mut next = match self.previous_cells {
        Some(cells) => cells,
        None => {
            let mut new_vec = Vec::with_capacity(self.width() * self.height());
            new_vec.resize(new_vec.capacity(), Cell::Dead);
            new_vec
        }
    };

    // Calculate next state, not relevant for question
    for row in 0..self.height as isize {
        for column in 0..self.width as isize {
            let index = self.get_index(row , column);
            let target_cell = self.cells[index];
            let live_neighbors = self.live_neighbor_count(row, column);

            next[index] = match target_cell {
                Cell::Alive => if live_neighbors == 2 || live_neighbors == 3 { Cell::Alive } else { Cell::Dead }
                Cell::Dead => if live_neighbors == 3 { Cell::Alive } else { Cell::Dead }
            }
        }
    }

    // swap values
    self.previous_cells = Some(self.cells);
    self.cells = next;
}

Теперь я получаю следующие ошибки от компилятора:

error[E0507]: cannot move out of `self.previous_cells.0` which is behind a mutable reference
  --> src/lib.rs:61:30
   |
61 |         let mut next = match self.previous_cells {
   |                              ^^^^^^^^^^^^^^^^^^^ help: consider borrowing here: `&self.previous_cells`
62 |             Some(cells) => cells,
   |                  -----
   |                  |
   |                  data moved here
   |                  move occurs because `cells` has type `std::vec::Vec<Cell>`, which does not implement the `Copy` trait

error[E0507]: cannot move out of `self.cells` which is behind a mutable reference
  --> src/lib.rs:83:36
   |
83 |         self.previous_cells = Some(self.cells);
   |                                    ^^^^^^^^^^ move occurs because `self.cells` has type `std::vec::Vec<Cell>`, which does not implement the `Copy` trait

Я понимаю, почему это происходит, но я не вижу решения, которое не включает копирование всего Ve c. Это было бы решением, но, может быть, есть лучшее?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...