Нет, этого не избежать с помощью предложенного вами синтаксиса. Ваш синтаксис не позволяет использовать ссылку, если в противном случае было бы допустимо перемещение. В этом примере inner
является копией целого числа из val
, и его изменение не влияет на val
:
fn main() {
let mut val = Some(42);
if let &mut Some(mut inner) = &mut val {
inner += 1;
}
println!("{:?}", val); // Some(42)
}
Ключевое слово ref
необходимо для принудительного получения ссылки:
fn main() {
let mut val = Some(42);
if let &mut Some(ref mut inner) = &mut val {
*inner += 1;
}
println!("{:?}", val); // Some(43)
}
Соответствие эргономике позволяет написать это более простым способом:
fn main() {
let mut val = Some(42);
if let Some(inner) = &mut val {
*inner += 1;
}
println!("{:?}", val);
}
Однако, если бы мы начинали только с этим синтаксисом, то, вероятно, имели быпротивоположная проблема и ключевое слово, одно, чтобы заставить движение вместо;возможно Some(move inner)
. В этой альтернативной вселенной будет задан вопрос, можно ли избежать ключевого слова move
.
См. Также: