2

Vec<T>次の 2 つの方法があります。

fn push(&mut self, value: T)
fn split_at_mut(&mut self, mid: usize) -> (&mut [T], &mut [T])

どちらもベクトルへの変更可能な参照を取ります。ただし、借用の範囲は異なるようです。たとえば、次のようになります。

fn works() {
    let mut nums: Vec<i64> = vec![1,2,3,4];
    nums.push(5);
    println!("{}", nums.len());
}

fn doesnt_work() {
    let mut nums: Vec<i64> = vec![1,2,3,4];
    let (l,r) = nums.split_at_mut(2);
    println!("{}", nums.len());
}

fn also_works() {
    let mut nums: Vec<i64> = vec![1,2,3,4];
    let _ = nums.split_at_mut(2);
    println!("{}", nums.len());
}

関数はコンパイルされdoesnt_workず、変更可能な借用が既にnumsあり、それが終了し、関数の最後であると述べています。から返された値を無視すると、問題は解決しますsplit_at_mut

4

2 に答える 2

5

ベクトル (およびベクトル自体) の値は文字通り借用されており、現在は and を介してのみアクセスできるため、innumsの借用は変数およびが存在するdoesnt_work限り続きます。lrlr

この効果は、letforlrend をスコープに入れて借用も終了することで確認できます。たとえば、このコードは正常に動作しますがprintln!、スコープ内 (中括弧内) に移動しようとすると失敗します。

fn works() {
    let mut nums = vec![1,2,3,4];

    {
        let (l, r) = nums.split_at_mut(2);
        //println!("{}", nums.len()); //println! will fail here
    }

    println!("{}", nums.len());
}

あなたのalso_works例では、結果に対して何もしないので、借用はすぐに失われます。基本的に、コンパイラは、メソッドの結果を介してベクトルにアクセスする方法がないことを確認できるため、元のベクトルを介して自由にアクセスできます。

于 2015-09-24T12:41:42.270 に答える