2016-08-08 78 views
0

我有一個結構,其中包含一個RefCell用於在向量中存儲可變值,並且我想遍歷它的值。通過RefCell循環包裝Vec與Rust

添加的元素不會引起問題,而是試圖借用向量轉換成它拋出一個迭代器時:

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

是的。正如你可以在這裏看到的:https://doc.rust-lang.org/std/iter/trait.IntoIterator.html 'into_iter'正在使用'self'(不是&self,或&mut self),這意味着它是消耗(移動)它被調用的對象。 你可以接受你自己的答案並以這種方式解決問題。 –