我正在阅读 Rust 101教程,作者以一个传递给函数的
Vec
对象为例,讲解了共享借用。下面是教程中所示范的稍微改编过的MWE。有趣的部分在于vec_min
中的v.iter()
。作者写道:
但是如果我在一个共享的对象上使用这次,我们明确请求向量
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();
}
into_iter()
既可以在&Vec
上工作也可以在Vec
上工作感到困惑,但是你参考的来源解释了这一点:Vec<T>
、&'a Vec<T>
和&'a mut Vec<T>
都有实现者。非常棒的内容! :) - mSSM