私はこれは動作しますが、私は、変数last
をインライン化したい46445645645564584.なぜ借用は配列アクセスの関数呼び出しをインライン展開できないのですか?
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);
}
}
のこのCollatzシーケンスの最初の500個の番号を生成するためのルーストにいくつかのコードを書いている:
でfor _ in 0..500 {
v.push(next(v[v.len() - 1]));
}
私の目は、プログラムのセマンティクスを変えるべきではありません。変数を単純にインライン化したからです。私はこれをコンパイルしようとすると、しかし、錆コンパイラは次のエラーを与える:私はそれを見るように値v[v.len() - 1]
がnext()
に計算され、渡されたとき
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
、v
の不変ボローは、右のドロップする必要があります。つまり、v
の変更可能な借用は、v.push()
への最も外側の呼び出しで成功することになります。これは、前回の借用が破棄されたためです。私はこれを間違って見ていますか?これはコンパイラのバグですか?
イテレータ/ジェネレータでもこれを行うことができますが、この特定のコードではなぜこのようなことが起こっているのかを知りたいと思います。 。
[英語以外の生涯](http://smallcultfollowing.com/babysteps/blog/2016/04/27/non-lexical-lifetimes-introduction/)が問題になるとすぐに問題が修正されるはずです安定したコンパイラ。 – user4815162342