gpt4 book ai didi

for-loop - 将向量传入 `for` 循环与对向量的引用是什么意思?

转载 作者:行者123 更新时间:2023-11-29 08:32:38 27 4
gpt4 key购买 nike

我对 Rust for 循环的工作方式感到困惑。请考虑以下事项:

#![feature(core_intrinsics)]

fn print_type_of<T>(_: T) {
println!("{}", unsafe { std::intrinsics::type_name::<T>() });
}

fn main() {
let nums = vec![1, 2, 3];
for num in &nums { print_type_of(num); }
for num in nums { print_type_of(num); }
}

输出如下:

&i32
&i32
&i32
i32
i32
i32

将向量传入 for 与对向量的引用是什么意思?为什么当您传入引用时,您会得到对项目的引用,而当您传入实际向量时,您会得到实际项目?

最佳答案

for 循环的参数必须实现 IntoIterator .如果你查看 docs for Vec , 你会看到这两个 implementations IntoIterator 的:

impl<T> IntoIterator for Vec<T> {
type Item = T;
type IntoIter = IntoIter<T>
}

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

您获得 &vec 的引用和 vec 的值,因为迭代器就是这样定义的。

有时,您会看到这些更明确的形式:iterinto_iter .同样的逻辑适用;见What is the difference between iter and into_iter?

您会遇到另一种形式:&mut veciter_mut .这些返回向量中元素的可变引用


至于为什么完全不同......

使用对向量的引用允许您在循环完成后访问向量。这编译:

let v = vec![1, 2, 3];
for i in &v {}
for i in &v {}

这不是:

let v = vec![1, 2, 3];
for i in v {}
for i in v {}
error[E0382]: use of moved value: `v`
--> src/main.rs:4:14
|
3 | for i in v {}
| - value moved here
4 | for i in v {}
| ^ value used here after move
|
= note: move occurs because `v` has type `std::vec::Vec<i32>`, which does not implement the `Copy` trait

在所有权方面,您无法从引用中获取值,除非您克隆该值(假设该类型甚至可以被克隆!)。这意味着 &vec 无法产生不是引用的值。

Vec 的迭代器的实现者可以选择只产生引用,但是将元素的所有权转移给迭代器允许迭代器的消费者做更多的事情;从能力的角度来看,它是首选。

另见:

关于for-loop - 将向量传入 `for` 循环与对向量的引用是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50573384/

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