A reference created with ref is exactly the same as reference taken with &.
The difference is where they’re allowed in the syntax. ref on the left side of an assignment is like adding & on the right side.
This redundancy exists because in pattern matching & is used to require that a reference exists already, rather than to make a new one:
let foo = 1;
match foo {
ref x => {
/* x == &1 */
match x {
&y => /* y == 1 */
}
},
}// A `ref` borrow on the left side of an assignment is equivalent to
// an `&` borrow on the right side.
let ref ref_c1 = c;
let ref_c2 = &c;