2016-08-08 5 views
0

ベクトル内に可変値を格納するためにRefCellを含む構造体があり、その値をループしたいと思います。要素を追加するRefCellでルーピングするとRustでVecがラップされます

は問題ないが、それはスローイテレータに借りたベクトルを変換しようとすると:それは不変だ場合

error: cannot move out of borrowed content [E0507]

なぜ借りても、問題ではありませんか?変数の内容が変更されなくても、コンパイラがこれを潜在的な問題としてマークする理由はわかりません。

私はオーナーシップの問題をクローンで回避することができますが、なぜ最初に行う必要がありますか?私がループしている構造をクローンすることはおそらくCPUコストが高くなる可能性があり、可能ならばそれをしなくてもよいと思っています。私が達成しようとしているものの

例:

fn main() { 
    use std::cell::RefCell; 
    let c = RefCell::new(vec![1, 2, 3]); 

    let arr = c.borrow(); 

    for i in arr.into_iter() { 
     println!("{}", i); 
    } 
} 

私はここに欠けているか、錆はこのことについて過度に慎重されているものはありますか?

誰かがこの仕組みの理解に間隙を埋めることができれば幸いです。

答えて

1

Vec.into_iterVec.iterの間に違いがあるようです。

for i in arr.into_iter() { 
    println!("{}", i); 
} 

へ:

for i in arr.iter() { 
    println!("{}", i); 
} 

Effectively Using Iterators In Rustで説明したように変化する、解決するには。

+0

はい。ここからわかるように、htt5://doc.rust-lang.org/std/iter/trait.IntoIterator.html 'into_iter'は' self'を取っています(selfではなく&selfであり、&mut selfです)。それが呼び出されているオブジェクトを消費(移動)します。 あなた自身の答えを受け入れることができ、このように質問を閉じることができます。 –

関連する問題