Ржавчина множественных изменчивых заимствований - PullRequest
0 голосов
/ 20 октября 2018

Я пробую Rust и у меня проблемы с пониманием "заимствования".

struct Foo<T> {
    data: T,
}

impl<T> Foo<T> {
    fn new(data: T) -> Self {
        Foo {
            data: data,
        }
    }
}

fn main() {
    let mut foo = Foo::new("hello");

    let x = &mut foo;
    let y = &mut foo;

    println!("{}", foo.data);

}

Почему этот код компилируется без ошибок?В конце концов, я получаю несколько изменяемых ссылок на foo.В документации написано следующее:

Правила ведения ссылок
Давайте подведем итоги того, что мы обсуждали о ссылках:

a) В любой момент времени выможет иметь одну (но не обе) одну изменяемую ссылку или любое количество неизменяемых ссылок.

b) Ссылки всегда должны быть действительными.

В чем причина такого поведения?Спасибо!

Ответы [ 2 ]

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

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

См. Также Что такое нелексические времена жизни.

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

В моей версии ржавчины (1.29.1) у меня есть ошибки с несколькими заимствованиями.

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

let mut foo = Foo::new("hello");

{ let x = &mut foo; }
{ let y = &mut foo; }

println!("{}", foo.data);

, который работает, потому что вы не используете x и y.

*: от @mcarton: оптимизация происходит после прохода проверки заимствования, поэтому единственный вариантNLL.

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