【问题标题】:Looping through a RefCell wrapped Vec with Rust使用 Rust 循环通过 RefCell 包装的 Vec
【发布时间】:2016-12-13 17:31:44
【问题描述】:

我有一个包含RefCell 的结构,用于在向量中存储可变值,我想循环遍历它的值。

添加元素不会导致任何问题,但是当尝试将借用的向量转换为迭代器时会抛出:

错误:无法移出借用内容 [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);
    }
}

我在这里遗漏了什么还是 Rust 对此过于谨慎?

如果有人能填补我对其工作原理的理解中的任何空白,我们将不胜感激。

【问题讨论】:

    标签: vector iterator rust


    【解决方案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 中所述。

    【讨论】:

    • 是的。正如您在此处看到的:doc.rust-lang.org/std/iter/trait.IntoIterator.html into_iter 正在使用 self(不是 &self 或 &mut self),这意味着它正在消耗(移动)它被调用的对象。您可以接受自己的答案并以这种方式结束问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-11
    • 1970-01-01
    相关资源
    最近更新 更多