Ключевое слово ref
Ключевое слово ref применяется в шаблонах
сопоставления, таких как let, match,
if let и while let. Оно указывает
компилятору создать ссылку на значение, а не
перемещать или копировать его. Это особенно полезно,
когда нужно избежать перемещения владения или
получить доступ к части структуры данных без
изменения оригинала.
Ключевое слово ref не является оператором
взятия ссылки & - оно работает именно
в контексте шаблонов. Параметров у него нет,
оно лишь модифицирует поведение привязки
переменной в шаблоне.
Синтаксис
let ref имя_переменной = значение;
match значение
{
ref имя_переменной => { /* ... */ }
}
Пример
Давайте создадим ссылку на строку с помощью
ref и выведем её на экран:
fn main()
{
let s = String::from("abcde");
let ref r = s;
println!("{}", r);
}
Результат выполнения кода:
"abcde"
Пример
Давайте используем ref в шаблоне
match, чтобы получить ссылку на элемент
кортежа без его перемещения:
fn main()
{
let t = (1, 2, 3);
match t
{
(ref a, _, _) => println!("{}", a),
}
println!("{:?}", t);
}
Результат выполнения кода:
1
(1, 2, 3)
Пример
Давайте применим ref к полю структуры,
чтобы получить ссылку на него:
struct Point
{
x: i32,
y: i32,
}
fn main()
{
let p = Point { x: 1, y: 2 };
let Point { ref x, ref y } = p;
println!("{} {}", x, y);
println!("{} {}", p.x, p.y);
}
Результат выполнения кода:
1 2
1 2