Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Общие ссылки

Ссылка даёт доступ к другому значению, не забирая владение этим значением; её также называют «заимствованием». Неизменяемые ссылки доступны только для чтения, и данные, на которые они указывают, не могут меняться.

// Copyright 2023 Google LLC
// SPDX-License-Identifier: Apache-2.0

fn main() {
    let a = 'A';
    let b = 'B';

    let mut r: &char = &a;
    dbg!(r);

    r = &b;
    dbg!(r);
}

Неизменяемая ссылка на тип T имеет тип &T. Значение-ссылка создаётся оператором &. Оператор * «разыменовывает» ссылку, возвращая её значение.

This slide should take about 7 minutes.
  • Ссылки в Rust никогда не бывают null, поэтому проверка на null не нужна.

  • Говорят, что ссылка «заимствует» значение, на которое указывает. Это хорошая модель для студентов, не знакомых с указателями: код может использовать ссылку для доступа к значению, но оно по-прежнему «принадлежит» исходной переменной. Владение курс рассмотрит подробнее в третий день.

  • Ссылки реализованы как указатели, и их ключевое преимущество — они могут быть намного меньше того, на что указывают. Студенты, знакомые с C или C++, узнают в ссылках указатели. Дальнейшие части курса расскажут, как Rust предотвращает ошибки безопасности памяти, которые возникают при использовании сырых указателей.

  • Явное взятие ссылки с помощью & обязательно, за исключением вызова методов: там Rust выполняет автоматическое взятие и разыменование ссылок.

  • В некоторых случаях Rust автоматически разыменовывает ссылки, в частности при вызове методов (попробуйте r.is_ascii()). Оператор ->, как в C++, не нужен.

  • В этом примере r объявлена изменяемой, чтобы её можно было переназначить (r = &b). Обратите внимание, что это меняет привязку r: она теперь ссылается на другое значение. Это отличается от C++, где присваивание ссылке меняет значение, на которое она указывает.

  • Неизменяемая ссылка не позволяет менять значение, на которое она указывает, даже если это значение было изменяемым. Попробуйте *r = 'X'.

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

  • Подробнее о заимствовании и предотвращении висячих ссылок мы поговорим, когда перейдём к владению.