Общие ссылки
Ссылка даёт доступ к другому значению, не забирая владение этим значением; её также называют «заимствованием». Неизменяемые ссылки доступны только для чтения, и данные, на которые они указывают, не могут меняться.
// 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. Значение-ссылка создаётся оператором &. Оператор * «разыменовывает» ссылку, возвращая её значение.
-
Ссылки в Rust никогда не бывают null, поэтому проверка на null не нужна.
-
Говорят, что ссылка «заимствует» значение, на которое указывает. Это хорошая модель для студентов, не знакомых с указателями: код может использовать ссылку для доступа к значению, но оно по-прежнему «принадлежит» исходной переменной. Владение курс рассмотрит подробнее в третий день.
-
Ссылки реализованы как указатели, и их ключевое преимущество — они могут быть намного меньше того, на что указывают. Студенты, знакомые с C или C++, узнают в ссылках указатели. Дальнейшие части курса расскажут, как Rust предотвращает ошибки безопасности памяти, которые возникают при использовании сырых указателей.
-
Явное взятие ссылки с помощью
&обязательно, за исключением вызова методов: там Rust выполняет автоматическое взятие и разыменование ссылок. -
В некоторых случаях Rust автоматически разыменовывает ссылки, в частности при вызове методов (попробуйте
r.is_ascii()). Оператор->, как в C++, не нужен. -
В этом примере
rобъявлена изменяемой, чтобы её можно было переназначить (r = &b). Обратите внимание, что это меняет привязкуr: она теперь ссылается на другое значение. Это отличается от C++, где присваивание ссылке меняет значение, на которое она указывает. -
Неизменяемая ссылка не позволяет менять значение, на которое она указывает, даже если это значение было изменяемым. Попробуйте
*r = 'X'. -
Rust отслеживает времена жизни всех ссылок, чтобы убедиться, что они живут достаточно долго. Висячие ссылки в безопасном Rust невозможны.
-
Подробнее о заимствовании и предотвращении висячих ссылок мы поговорим, когда перейдём к владению.