【发布时间】: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();
}
【问题讨论】: