Почему я не могу вызвать loan_mut () после индексации в неизменяемый Vec <RefCell>? - PullRequest
0 голосов
/ 25 октября 2018

Давайте попробуем скомпилировать этот код:

use std::cell::RefCell;

struct Foo {
    v: Vec<RefCell<u8>>,
}

impl Foo {
    fn f(&self, i: usize) {
        let t = &mut *self.v[i].borrow_mut();
        //let t = &mut *{self.v[i].borrow_mut()}; //compiled ok
    }
}

fn main() {}

Ошибка компиляции:

error[E0596]: cannot borrow field `self.v` of immutable binding as mutable
 --> src/main.rs:9:23
  |
8 |     fn f(&self, i: usize) {
  |          ----- use `&mut self` here to make mutable
9 |         let t = &mut *self.v[i].borrow_mut();
  |                       ^^^^^^ cannot mutably borrow field of immutable binding

Почему этот код требует добавления &mut self в сигнатуру функции для компиляции?

Ответы [ 2 ]

0 голосов
/ 25 октября 2018

Другим обходным решением является явный вызов RefCell::borrow_mut(&v[0]).

0 голосов
/ 25 октября 2018

Это известная проблема , где IndexMut иногда выбирается, когда Index фактически должен использоваться.

Ваш обходной путь использования {} является разумным, но вы также можетеиспользуйте Index в явном виде:

use std::cell::RefCell;

fn f(v: Vec<RefCell<u8>>) {
    use std::ops::Index;
    let _t = &mut v.index(0).borrow_mut();
}

fn main() {}

См. также:

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