For loop “for i in”和“for i in”之间有区别吗;v`和`对于v`中的i `?

For loop “for i in”和“for i in”之间有区别吗;v`和`对于v`中的i `?,for-loop,rust,reference,For Loop,Rust,Reference,我目前正在阅读,其中包含以下代码: let v = vec![100, 32, 57]; for i in &v { println!("{}", i); } 我不确定为什么和在中对于I-in&v是必需的。我尝试删除它,代码仍然有效。对于v中的i来说,是做了相同的事情,还是有所不同 我不确定为什么在I in&v中需要和。我尝试删除它,代码仍然有效。对于v中的i来说,是做同样的事情,还是有所不同 它可以做一些稍微不同的事情(或者,如果你愿意,它可以在不同的结构上做相同的事情)。问

我目前正在阅读,其中包含以下代码:

let v = vec![100, 32, 57];
for i in &v {
    println!("{}", i);
}
我不确定为什么
中对于I-in&v
是必需的。我尝试删除它,代码仍然有效。对于v中的i来说,
是做了相同的事情,还是有所不同

我不确定为什么在I in&v中需要和。我尝试删除它,代码仍然有效。对于v中的i来说,是做同样的事情,还是有所不同

它可以做一些稍微不同的事情(或者,如果你愿意,它可以在不同的结构上做相同的事情)。问题在于,在第8章中,您对这些概念的理解有点早,尤其是在不了解您使用其他编程语言的经验的情况下

我强烈建议你继续阅读,或者你最终会发现(或者你自己理解,我不记得它是否明确),或者你可以稍后再看

如果这真的让你感到困扰,以下是我的解释:

与其他各种编程语言一样,Rust的
for
循环处理可以迭代的任意事物(有时称为“iterables”)。在Rust中,这个概念表示为,也称为“可以转换为迭代器的事物”。现在,“Into”前缀很重要,因为它通常意味着使用转换(之后)。就是

让a=thing();
让b=a.进入i iter();
//普林顿!(“{:?}”,a);//可能是一个错误,因为前一行“消耗了”`a`除非它是琐碎的和复制的
到目前为止还不错。在一种情况下,Rust将
Vec::调用到iter
,在另一种情况下,它将
::调用到iter
。对于许多方法来说,这没有什么区别,因为只有一种方法存在。然而,这对于迭代器来说确实很重要,因为两者都存在

impl<T> IntoIterator for Vec<T> 
在循环之后

这还有另一个后果,在这里不太相关,但在其他情况下:如果我们更广泛地看两个实现的声明,我们会得到:

用于Vec的impl into迭代器{ 类型项=T; [...] } impl(有关详细信息,请参阅。)

这里有一个更简单的解释

正如您在本节之前所了解的,分配非变量会导致移动而不是复制。例如:

let a = String::from("hello");
let b = a;                     // move

println!("{} {}", a, b);       // error: borrow of moved value
类似地,将
Vec
赋予
for
循环将所有权转移给循环。对于
Vec
,每个元素都会被移动到循环变量中,循环后将无法再访问
Vec

fn main() {
    // creates a Vec<String>
    let v: Vec<_> = ["a", "b", "c"].iter().copied().map(String::from).collect();

    // elements are moved into s, no clone required
    for s in v {
        println!("{}", s);
    }

    // error[E0382]: borrow of moved value: `v`
    // println!("{:?}", v);
}
()


请注意,即使整数是
Copy
,包含它们的
Vec
也不是。

这是否回答了您的问题?这回答了你的问题吗?“你只能从尸体上偷东西”-听起来像是免费后可以使用。。。
let a = String::from("hello");
let b = a;                     // move

println!("{} {}", a, b);       // error: borrow of moved value
fn main() {
    // creates a Vec<String>
    let v: Vec<_> = ["a", "b", "c"].iter().copied().map(String::from).collect();

    // elements are moved into s, no clone required
    for s in v {
        println!("{}", s);
    }

    // error[E0382]: borrow of moved value: `v`
    // println!("{:?}", v);
}
fn main() {
    // creates a Vec<String>
    let v: Vec<_> = ["a", "b", "c"].iter().copied().map(String::from).collect();

    // s is a reference to individual elements
    for s in &v {
        println!("{}", s);
    }

    // v can still be accessed
    println!("{:?}", v);
}