Может ли элемент RefCell > хранится в структуре изменить значения другого элемента в том же Ve c? - PullRequest
1 голос
/ 30 марта 2020

У меня есть структура, содержащая вектор, элементы которого должны иметь возможность изменять другие элементы в векторе.

Я пытался сделать это так:

use core::cell::RefCell;

struct Go {
    car: i32,
}

impl Go {
    pub fn attack(&mut self, val: &mut Self) {
        val.car = self.car;
        self.car = 5;
    }
}

struct World {
    pub params: RefCell<Vec<Go>>,
    pub val: i32,
}

fn main() {
    let world = World {
        params: RefCell::new(vec![]),
        val: 42,
    };

    for m in 0..10 {
        world.params.borrow_mut().push(Go { car: m });
    }

    world.params.borrow()[5].attack(&mut world.params.borrow()[6]);
}

детская площадка

Однако я получил эти ошибки

error[E0596]: cannot borrow data in a dereference of `std::cell::Ref<'_, std::vec::Vec<Go>>` as mutable
  --> src/main.rs:29:5
   |
29 |     world.params.borrow()[5].attack(&mut world.params.borrow()[6]);
   |     ^^^^^^^^^^^^^^^^^^^^^ cannot borrow as mutable
   |
   = help: trait `DerefMut` is required to modify through a dereference, but it is not implemented for `std::cell::Ref<'_, std::vec::Vec<Go>>`

error[E0596]: cannot borrow data in a dereference of `std::cell::Ref<'_, std::vec::Vec<Go>>` as mutable
  --> src/main.rs:29:42
   |
29 |     world.params.borrow()[5].attack(&mut world.params.borrow()[6]);
   |                                          ^^^^^^^^^^^^^^^^^^^^^ cannot borrow as mutable
   |
   = help: trait `DerefMut` is required to modify through a dereference, but it is not implemented for `std::cell::Ref<'_, std::vec::Vec<Go>>`

Как мне это сделать? Также обратите внимание, что из-за некоторых ограничений я не хочу создавать никаких дополнительных переменных в главной функции.

Функция атаки работает как функция обновления для различных элементов ve c в основной программе. Я должен бежать

...