Ответ 1
При замене переменных наиболее вероятно, что вам нужно создать новые привязки для a
и b
.
fn main() {
let (a, b) = (1, 2);
let (b, a) = (a, a + b);
}
Тем не менее, в вашем конкретном случае, нет хорошего решения. Когда вы делаете, как указано выше, вы всегда создаете новые привязки для a
и b
, но вы хотите изменить существующие привязки. Одно из известных мне решений заключается в использовании временного:
fn fibonacci(n: u64) -> u64 {
if n < 2 {
return n;
}
let mut fib_prev = 1;
let mut fib = 1;
for _ in 2..n {
let next = fib + fib_prev;
fib_prev = fib;
fib = next;
}
fib
}
Вы также можете сделать так, чтобы вы мутировали кортеж:
fn fibonacci(n: u64) -> u64 {
if n < 2 {
return n;
}
let mut fib = (1, 1);
for _ in 2..n {
fib = (fib.1, fib.0 + fib.1);
}
fib.1
}
Вы также можете быть заинтересованы в обмене содержимого двух частей памяти. 99+% времени, вы хотите повторно связать переменные, но очень небольшое количество времени вы хотите изменить вещи "на месте":
fn main() {
let (mut a, mut b) = (1, 2);
std::mem::swap(&mut a, &mut b);
println!("{:?}", (a, b));
}
Обратите внимание, что это не лаконично, чтобы сделать этот обмен и добавить значения вместе в один шаг.
Смотрите также: