首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在共享的借来的Vec上,iter()和into_iter()之间的区别?

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

Stack Overflow用户
提问于 2015-08-26 19:17:47
回答 1查看 3.8K关注 0票数 8

我正在阅读生锈101教程,在这里,作者用传递给函数的Vec对象的例子来讨论共享借用。下面是本教程所教内容的一个稍微修改过的MWE。有趣的部分是v.iter() in vec_min。作者写道:

这一次,我们显式地请求向量v的迭代器。方法iter借用它工作的向量,并提供元素的共享借用。

但是,如果我在共享的对象上使用for ... in ...构造会发生什么呢?根据这篇博客文章的说法,这个隐式for循环使用了into_iter(),获得了v的所有权。但是它不能真正地在这个函数中获得v的所有权,因为它只是从一开始就借用了它,对吗?

有人能解释一下into_iter()iter()对我借来的对象的区别吗?

代码语言:javascript
复制
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();
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-08-26 19:23:35

没有什么区别。

它不能真正地在该函数中获得v的所有权,因为它只是从

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

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

代码语言:javascript
复制
impl<'a, T> IntoIterator for &'a Vec<T>

资料来源

代码语言:javascript
复制
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

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

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32234954

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档