【问题标题】:Difference between iter() and into_iter() on a shared, borrowed Vec?共享的借用 ​​Vec 上的 iter() 和 into_iter() 之间的区别?
【发布时间】:2015-11-20 23:37:53
【问题描述】:

我正在阅读Rust 101 tutorial,其中作者以Vec 对象传递给函数的示例讨论了共享借用。下面是本教程所教内容的稍微改编的 MWE。有趣的部分是vec_min 中的v.iter()。作者写道:

这一次,我们明确地为向量v 请求一个迭代器。 iter 方法借用了它所处理的向量,并提供了元素的共享借用。

但是如果我在共享对象上使用for ... in ... 构造会发生什么?根据this blog post,这个隐式for循环使用into_iter(),获得v的所有权。但它并不能真正获得该函数中v 的所有权,因为它只是一开始就借用了它,对吧?

有人可以向我解释应用于借用对象的into_iter()iter() 之间的区别吗?

enum NumberOrNothing {
    Number(i32),
    Nothing,
}
use self::NumberOrNothing::{Number,Nothing};

impl NumberOrNothing {
    fn print(self) {
        match self {
            Nothing => println!("The number is: <nothing>"),
            Number(n) => println!("The number is: {}", n),
        };
    }
}

fn vec_min(v: &Vec<i32>) -> NumberOrNothing {
    fn min_i32(a: i32, b: i32) -> i32 {
        if a < b {a} else {b}
    }

    let mut min = Nothing;
    for e in v.iter() {
    //Alternatively implicitly and with *e replaced by e:
    //for e in v {
        min = Number(match min {
            Nothing => *e,
            Number(n) => min_i32(n, *e),
        });
    }
    min
}

pub fn main() {
    let vec = vec![18,5,7,2,9,27];
    let foo = Nothing;
    let min = vec_min(&vec);
    let min = vec_min(&vec);
    min.print();
}

【问题讨论】:

    标签: iterator rust shared


    【解决方案1】:

    没有区别。

    它不能真正获得该函数中 v 的所有权,因为它只是一开始就借用了它

    它绝对可以拥有v,因为那是&amp;Vec。请注意此处的精确语义 - 您获得的是引用的所有权,而不是被引用项的所有权。

    如果您查看implementors of IntoIterator,您可以找到:

    impl<'a, T> IntoIterator for &'a Vec<T>
    

    还有source for that

    impl<'a, T, A: Allocator> IntoIterator for &'a Vec<T, A> {
        type Item = &'a T;
        type IntoIter = slice::Iter<'a, T>;
    
        fn into_iter(self) -> slice::Iter<'a, T> {
            self.iter()
        }
    }
    

    惊喜——它调用iter

    同样的逻辑适用于&amp;mut vecvec.iter_mut()

    【讨论】:

    • 好的,太好了,非常感谢!我也对into_iter() 可以同时在&amp;VecVec 上工作感到困惑,但是您引用的源解释了它:Vec&lt;T&gt; 以及&amp;'a Vec&lt;T&gt;&amp;'a mut Vec&lt;T&gt; 都有一个实现者。很酷的东西! :)
    猜你喜欢
    • 2021-12-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多