我正在阅读Rust 101 tutorial,其中作者讨论了共享借用与传递给函数的values(substr(timestamp(current timestamp),1,16))
对象的示例。下面是教程正在教授的略微改进的MWE。有趣的部分是Vec
中的v.iter()
。作者写道:
这一次,我们显式请求了向量
vec_min
的迭代器。方法v
借用它所处理的向量,并提供元素的共享借用。
但是如果我在共享的对象上使用iter
构造会发生什么?根据{{3}},此隐式for循环使用for ... in ...
,取得into_iter()
的所有权。但它不能真正取得v
在该函数中的所有权,因为它只是从它开始借用它,对吗?
有人可以解释应用于借用对象的v
和into_iter()
之间的差异吗?
iter()
答案 0 :(得分:9)
但它不能真正取得该函数中v的所有权,因为它只是从它开始借用
绝对可以取得v
的所有权,因为那是&Vec
。请注意这里的精确语义 - 您将获取参考的所有权,而不是所引用项目的所有权。
如果您查看implementors of IntoIterator
,则可以找到:
impl<'a, T> IntoIterator for &'a Vec<T>
impl<'a, T> IntoIterator for &'a Vec<T> {
fn into_iter(self) -> slice::Iter<'a, T> {
self.iter()
}
}
惊喜 - 它呼叫iter
!所以你的问题的答案是:没有区别。