gpt4 book ai didi

for-loop - `for i in &v`和 `for i in v`之间有区别吗?

转载 作者:行者123 更新时间:2023-12-03 11:27:25 26 4
gpt4 key购买 nike

我目前正在阅读chapter 8 of The Rust Programming Language,其中包含以下代码:

let v = vec![100, 32, 57];
for i in &v {
println!("{}", i);
}

我不确定为什么 &中需要 for i in &v。我尝试将其删除,但代码仍然有效。 for i in v是做相同的事情还是以某种方式不同?

最佳答案

I'm not sure why the & is necessary in for i in &v. I tried removing it and the code still works. Does for i in v do the same thing, or is it different somehow?


它所做的事情略有不同(或者,如果您愿意,也可以在不同的结构上执行相同的事情)。问题在第8章,您对于这些概念还为时过早,尤其是在不了解其他编程语言经验的情况下。
我强烈建议您继续阅读,或者您最终会发现(或者自己理解,我不记得它是否是明确的),或者您可以稍后再使用。
如果确实让您感到困扰,请尝试以下解释:
与其他各种编程语言一样,Rust的 for循环可处理可以迭代的任意事物(有时称为“可迭代”)。在Rust中,该概念由 IntoIterator 表示,也称为“可以转换为迭代器的事物”。现在,“Into”前缀很重要,因为它通常意味着要消耗转换(在 the Into trait之后)。那是,
let a = thing();
let b = a.into_iter();
// println!("{:?}", a); // probably an error because the previous line "consumed" `a` unless it's trivial and copy
到目前为止,一切都很好。在一种情况下,Rust调用 Vec::into_iter,在另一种情况下,它调用 <&Vec>::into_iter。对于许多方法,这没有什么区别,因为仅存在一种这样的方法。但是,这对于 IntoIterator确实很重要,因为两者都存在
impl<T> IntoIterator for Vec<T> 
impl<'a, T> IntoIterator for &'a Vec<T>
为什么和有什么区别?好吧,在上面我注意到 IntoIterator消耗了它的主题,因此第一个消耗了 Vec,而第二个公正...消耗了对 Vec的引用,这甚至没有消耗,因为可以复制引用。
因此,在原始情况下,您可以在对其进行迭代后继续使用 Vec,但在修改后就不能使用,因为向量已被for循环消耗并破坏了。您可以通过添加
println!("{:?}", v);
循环之后, the second one will refuse to build
这还有另一个结果,在这里不太相关,但在其他情况下:如果我们更广泛地看一下两个实现的声明,我们会得到:
impl<T> IntoIterator for Vec<T> {
type Item = T;

[...]
}

impl<'a, T> IntoIterator for &'a Vec<T> {
type Item = &'a T;

[...]
}
Item关联的类型不同:在第一种情况下,由于使用了向量,因此迭代器可以移动(并提供)集合中包含的实际项目。但是,在第二种情况下,由于不使用向量,因此循环无法拥有这些物品:这会被偷,而在Rust中,您只能从尸体上偷东西。因此,它只能分发对该项目的引用。
这与非 Copy类型最相关(这里不是整数,因为 Copy),因为它会影响您可以对项目执行的特定操作(即,在循环中)。

关于for-loop - `for i in &v`和 `for i in v`之间有区别吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61907150/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com