Означает ли изменяемая ссылка потерю права собственности в Rust?

Это упражнение из Шорохи после исправления дает:

    fn move_semantics4() {
        let mut x = Vec::new();
        let y = &mut x;
        y.push(42);
        let z = &mut x;
        z.push(13);
        assert_eq!(x, [42, 13]);
    }

Если я проведу это через Aquascope, в средстве проверки займов выдаст:

Я не понимаю, почему x теряет право собственности на L3 и L5. AFAIK, изменяемая ссылка, присвоенная y и z, подразумевает:

  • На x больше нельзя создать ссылку (одновременно может быть только одна изменяемая ссылка).
  • Возможность y и z (последовательно) читать и писать в векторе.

Но не теряя права собственности.

По моему мнению, визуальное представление подтверждает сохранение права собственности x:

Может ли кто-нибудь уточнить это?

Обновлено: для полноты картины я создал еще один фрагмент с ссылкой на перемещение и изменяемую ссылку, и при выполнении перемещения появляется специальный символ (жирная стрелка):

Нет. x продолжает оставаться владельцем Vec на протяжении всего фрагмента.

Richard Neumann 21.08.2024 12:00

Я посетил этот сайт Aquascope и не смог найти на нем никакого ключа, определяющего, что означает O (или W и R).

Richard Neumann 21.08.2024 12:05
Почему Python в конце концов умрет
Почему Python в конце концов умрет
Последние 20 лет были действительно хорошими для Python. Он прошел путь от "просто языка сценариев" до основного языка, используемого для написания...
1
2
53
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

На веб-сайте Aquascope вы можете навести курсор на пиктограммы, такие как +R/-R/+W/-W/+O/-O, и стрелки, такие как , и появится всплывающая подсказка о значении (то же самое можно просмотреть и в необработанном HTML-дереве).

В частности, это показывает:

+O Путь не имел собственных разрешений до предыдущей строки и получил их после этой строки"

-O Путь имел собственные разрешения до предыдущей строки и потерял их после этой строки.

Путь позаимствован здесь

Так ведь в строке 3 действие на x → -O можно понимать как x здесь заимствовано, и «потеря собственного разрешения» не означает, что x больше не владеет объектом, это означает, что он больше не может передать право собственности кому-либо , поскольку существует заимствование. Между тем, y → +O означает, что y объект создается, но это ссылка, и он может передавать право собственности на ссылку, а не на объект, на который ссылается.

В строке 4 срок жизни y заканчивается, он уничтожается, таким образом x → +O получил возможность передать право собственности (хотя он всегда сохранял право собственности)

Другие вопросы по теме