2017-11-20 2 views
0

私はこれは動作しますが、私は、変数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); 
    } 
} 

のこのCollat​​zシーケンスの最初の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()への最も外側の呼び出しで成功することになります。これは、前回の借用が破棄されたためです。私はこれを間違って見ていますか?これはコンパイラのバグですか?

イテレータ/ジェネレータでもこれを行うことができますが、この特定のコードではなぜこのようなことが起こっているのかを知りたいと思います。 。

答えて

0

Rustの借りチェッカーのパワーを原則的に拡張して、あなたが行った分析を行うことができるのは間違いありませんが、借りチェッカーは現在のところそのような推論ができません。

v.pushは、vを借りた後、next(v[v.len() - 1])の式を解析します。 vは既にv.pushによって借用されているため、借用チェッカーは失敗します。

ボローチェッカーは厄介なものになる可能性がありますが、明らかに改善することができますが、これはボローチェッカーの予想される動作です。解決策は、インデックス作成操作をプッシュ操作から切り離すことです。もともとしました。コンパイラは、(すべての借用チェックを行った後に)操作をインライン化するのに十分なほどスマートです。

+0

[英語以外の生涯](http://smallcultfollowing.com/babysteps/blog/2016/04/27/non-lexical-lifetimes-introduction/)が問題になるとすぐに問題が修正されるはずです安定したコンパイラ。 – user4815162342

関連する問題