&
применяется к rvalue (типу), в то время как ref
применяется к lvalue (имени переменной), но они оба делают одно и то же.
ref
было полезно внутри шаблонапотому что у вас есть доступ только к lvalue:
#![feature(core_intrinsics)]
fn print_type<T>(_: T) {
println!("{}", unsafe { std::intrinsics::type_name::<T>() })
}
fn main() {
let opt = Some(0);
match opt {
Some(ref i) => print_type(i), // &i32
None => (),
}
}
Однако сегодня это ключевое слово не очень полезно, потому что сопоставление с образцом является более "умным".Он понимает, что если вы заимствуете соответствующее значение, это означает, что вы хотите заимствовать внутреннее:
match &opt {
Some(i) => print_type(i), // &i32
None => (),
}