Ответ 1
ref
используется в шаблонах для привязки ссылки к lvalue (значение lvalue - это значение, которое вы можете принимать по адресу более или менее).
Важно понимать, что шаблоны идут "назад" из нормальных выражений, поскольку они используются для деконструировать значения.
Вот простой пример. Предположим, что мы имеем:
let value = 42;
Мы можем привязать ссылку к value
двумя способами:
let reference1 = &value;
let ref reference2 = value;
В первом случае мы используем &
в качестве оператора, чтобы принять адрес value
. Во втором случае мы используем шаблон ref
для "деконструирования" значения l. В обоих случаях тип переменной &i32
.
&
также может использоваться в шаблонах, но он делает обратное: он деконструирует ссылку, разыгрывая ее. Предположим, что:
let value = 42;
let reference = &value;
Мы можем разыменовать reference
двумя способами:
let deref1 = *reference;
let &deref2 = reference;
Здесь тип deref1
и deref2
равен i32
.
Не всегда можно написать одно и то же выражение двумя способами, как показано здесь. Например, вы не можете использовать &
для ссылки на значение, сохраненное в варианте перечисления: вам нужно сопоставить его. Например, если вы хотите взять ссылку на значение в Some
, вам нужно написать:
match option {
Some(ref value) => { /* stuff */ }
None => { /* stuff */ }
}
поскольку в Rust нет способа использовать оператор &
для доступа к значению в противном случае.