共享,借用Vec上的iter()和into_iter()之间的区别?

mSS*_*SSM 6 iterator shared rust

我正在阅读Rust 101教程,其中作者讨论了共享借用与Vec传递给函数的对象的示例.下面是教程正在教授的略微改进的MWE.有趣的部分是v.iter()vec_min.作者写道:

这一次,我们显式请求向量的迭代器v.该方法iter借用它所处理的向量,并提供元素的共享借用.

但是如果我for ... in ...在共享的对象上使用构造会发生什么?根据这篇博客文章,这个隐含的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();
}
Run Code Online (Sandbox Code Playgroud)

She*_*ter 9

但它不能真正取得该函数中v的所有权,因为它只是从它开始借用它

它绝对可以取得所有权v,因为那是一个&Vec.请注意这里的精确语义 - 您将获取引用的所有权,而不是引用项目的所有权.

如果您查看了实现者IntoIterator,您可以找到:

impl<'a, T> IntoIterator for &'a Vec<T>
Run Code Online (Sandbox Code Playgroud)

而这个来源:

impl<'a, T> IntoIterator for &'a Vec<T> {
    fn into_iter(self) -> slice::Iter<'a, T> {
        self.iter()
    }
}
Run Code Online (Sandbox Code Playgroud)

惊喜 - 它叫iter!所以你的问题的答案是:没有区别.

  • 对,这很棒,非常感谢!我也很困惑`into_iter()`可以同时处理`&Vec`和`Vec`,但你引用的来源解释了它:有一个'Vec <T>`的实现者以及`&'一个Vec <T>`和'&'一个mut Vec <T>`.很酷的东西!:) (3认同)