Подтвердить что ты не робот

Какая разница между `&` и `ref`?

Я понимаю, как работает &, но в чем разница между этим и ref? Являются ли они взаимозаменяемыми?

Единственная информация, которую я нашел (потому что поиск символов в Google не очень хорошо работает) эта страница на Rust By Example, но это не объясняет разница между ними. Книга не очень информативна, а ref указана только в главе Patterns. Но кажется, что ref используется вне этого контекста.

Итак, что такое использование ref, и какова разница с &?

4b9b3361

Ответ 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 нет способа использовать оператор & для доступа к значению в противном случае.