Kiedy zamiana zmiennych, najbardziej prawdopodobną rzeczą, którą chcesz jest stworzenie nowych powiązania dla a
i b
.
fn main() {
let (a, b) = (1, 2);
let (b, a) = (a, a + b);
}
Jednak w twoim przypadku nie ma dobrego rozwiązania. Gdy wykonasz powyższe czynności, zawsze tworzysz nowe wiązania dla a
i b
, ale chcesz zmodyfikować istniejące powiązania. Jednym z rozwiązań wiem jest użycie tymczasowej:
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
}
Można też zrobić to tak, że mutują krotki:
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
}
Możesz być także zainteresowany zamiana zawartości dwóch kawałków pamięć. 99 +% czasu, chcesz ponownie powiązać zmienne, ale bardzo niewielką ilość czasu, którą chcesz zmienić ten stan rzeczy „na miejscu”:
fn main() {
let (mut a, mut b) = (1, 2);
std::mem::swap(&mut a, &mut b);
println!("{:?}", (a, b));
}
pamiętać, że to nie jest zwięzły, aby to zrobić swap oraz dodaj wartości razem w jednym kroku.
Proszę przeczytać [* The Rust Programming Language *] (http://doc.rust-lang.org/stable/book/). Obejmuje wiele tematów wprowadzających. – Shepmaster
@Shepmaster, spędził trochę czasu czytając o [swap] (http://doc.rust-lang.org/std/mem/fn.swap.html) i [replace] (http: //doc.rust-lang. org/std/mem/fn.replace.html), ale nie jestem pewien, czy tego potrzebuję. –