ich einige Code in Rust Schreiben für die ersten 500 Zahlen in der Collatz Folge von 46445645645564584. ErzeugungWarum verhindert das Ausleihen das Einreihen eines Funktionsaufrufs in den Arrayzugriff?
use std::fmt::Debug;
//Calculate the first 500 numbers in the Collatz sequence of 46445645645564584
fn main() {
let mut v = vec![46445645645564584];
for _ in 0..500 {
let last = v[v.len() - 1];
v.push(next(last));
}
print_array(&v);
}
fn next(n: i64) -> i64 {
if n % 2 == 0 {
n/2
} else {
3 * n + 1
}
}
fn print_array<T: Debug>(v: &[T]) {
for x in v {
println!("{:?}", x);
}
}
Dies funktioniert, aber ich möchte die Variable last
inline:
for _ in 0..500 {
v.push(next(v[v.len() - 1]));
}
In Meine Augen, das sollte die Semantik des Programms nicht ändern, da ich einfach eine Variable inline eingezeichnet habe. Allerdings gibt den Rust Compiler die folgenden Fehler, wenn ich versuche, dies zu kompilieren:
error[E0502]: cannot borrow `v` as immutable because it is also borrowed as mutable
--> src/main.rs:9:21
|
9 | v.push(next(v[v.len() - 1]));
| - ^ - mutable borrow ends here
| | |
| | immutable borrow occurs here
| mutable borrow occurs here
error[E0502]: cannot borrow `v` as immutable because it is also borrowed as mutable
--> src/main.rs:9:23
|
9 | v.push(next(v[v.len() - 1]));
| - ^ - mutable borrow ends here
| | |
| | immutable borrow occurs here
| mutable borrow occurs here
Wie ich es sehe, die unveränderlich borrow von v
sollte fallen gelassen recht, wenn der Wert v[v.len() - 1]
berechnet wird und auf next()
weitergegeben. Das bedeutet, dass der veränderbare Kredit von v
im äußersten Call zu v.push()
erfolgreich sein würde, da der vorherige Borgen gelöscht wurde. Sehe ich das falsch? Oder ist das ein Compiler Bug?
Ich bin mir bewusst, dass Sie dies auch mit Iteratoren/Generatoren tun könnten, aber ich würde gerne wissen, warum dies in diesem bestimmten Code geschieht, da dies ein Problem sein könnte, auf das ich irgendwann noch einmal zurückkommen werde .
Das Problem sollte eigentlich behoben werden, sobald [non-lexikalische Lebenszeiten] (http://smallcultfollowing.com/babysteps/blog/2016/04/27/non-lexical-lifetimes-in-troduction/) es in die machen stabiler Compiler. – user4815162342