Неожиданный второй изменчивый заем на структуре - PullRequest
0 голосов
/ 08 марта 2020

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

Я создал игровую площадку моего кода, повторяющего мою проблему - код, вставленный ниже.

Я получаю ошибку cannot borrow '*context' as mutable more than once at a time, но, как я ее читаю, первый &mut выпускается раньше второго. Может кто-то пролить свет на то, почему это происходит?

struct Context {
    foo: Option<String>,
    bar: Option<String>
}

impl Context {
    fn new() -> Self {
        Context {
            foo: None,
            bar: None
        }
    }

    fn foo(&mut self) -> &String {
        if self.foo.is_none() {
            let message = String::from("foo");
            self.foo = Some(message);
        }

        self.foo.as_ref().unwrap()
    }

    fn bar(&mut self) -> &String {
        if self.bar.is_none() {
            let message = String::from("bar");
            self.bar = Some(message);
        }

        self.bar.as_ref().unwrap()
    }
}

fn print(context: &mut Context) {
    let foo = context.foo();
    let bar = context.bar();

    println!("{}{}", foo, bar);
}

fn main() {
    let mut context = Context::new();

    print(&mut context);
}

1 Ответ

0 голосов
/ 08 марта 2020

Предположение, что первое &mut перед вторым неверно.

Функция: fn foo(&mut self) -> &String имеет время жизни, поэтому более полно fn foo<'a>(&'a mut self) -> &'a String, поэтому время жизни &mut соответствует возвращаемому String, который присвоен foo.

Поскольку время жизни foo будет до макроса println!, ссылка &mut будет иметь то же значение время жизни, предотвращая его заимствование по второй ссылке.

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