首页 文章

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

提问于
浏览
6

我正在阅读Rust 101 tutorial,其中作者谈到共享借用的例子是传递给函数的 Vec 对象 . 下面是教程正在教授的略微改进的MWE . 有趣的部分是 vec_minvec_min . 作者写道:

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

但是如果我在共享的对象上使用 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();
}

1 回答

  • 9

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

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

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

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

    并且source for that

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

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

相关问题