Это может помочь рассматривать ссылку как своего рода контейнер. Для сравнения рассмотрим Option
, где мы можем «развернуть» значение, используя сопоставление с образцом, например, в операторе if let
:
let n = 100;
let opt = Some(n);
if let Some(p) = opt {
// do something with p
}
Мы называем Some
и None
конструкторами для Option
, поскольку каждый из них выдает значение типа Option
. Точно так же вы можете думать о &
как о конструкторе для ссылки. И синтаксис симметричен:
let n = 100;
let reference = &n;
if let &p = reference {
// do something with p
}
Вы можете использовать эту функцию в любом месте, где вы привязываете значение к переменной, что происходит повсеместно. Например:
if let
, как указано выше
match
выражения:
match opt {
Some(1) => { ... },
Some(p) => { ... },
None => { ... },
}
match reference {
&1 => { ... },
&p => { ... },
}
В аргументах функции:
fn foo(&p: &i32) { ... }
Loops:
for &p in iter_of_i32_refs {
...
}
И, вероятно, больше .
Обратите внимание, что последние два не будут работать для Option
, потому что они будут паниковать, если будет найден None
вместо Some
, но это не может произойти со ссылками, потому что у них только один конструктор, &
.
различается ли значение &
в зависимости от контекста?
Надеюсь, если вы сможете интерпретировать &
как конструктор вместо оператора, то вы увидите, что его значение не меняется. Это довольно интересная особенность Rust - вы можете использовать конструкторы в правой части выражения для создания значений и в левой части для их разделения (деструктурирование).