将向量(以及其他集合类型)表示为Iterator是否准确?

例如,我可以用以下方式循环一个向量,因为它实现了Iterator特征(据我所知):

let v = vec![1, 2, 3, 4, 5];

for x in &v {
    println!("{}", x);
}

然而,如果我想使用属于Iterator特征的函数(比如foldmapfilter),为什么我必须首先对该向量调用iter()

我的另一个 idea 是,向量可以转换成Iterator,在这种情况下,上面的语法更有意义.

推荐答案

不,向量不是迭代器.

但它实现了trait IntoIteratorfor循环使用它将向量转换为所需的迭代器.

documentation for Vec中,你可以看到IntoIterator是通过三种方式实现的:

  • 对于Vec<T>,它被移动,迭代器返回T类型的项,
  • 对于共享引用&Vec<T>,迭代器返回共享引用&T
  • 对于&mut Vec<T>,返回可变引用.

iter()只是Vec中的一个方法,用于将Vec<T>直接转换为返回共享引用的迭代器,而无需首先将其转换为引用.有一种同级方法iter_mut()用于生成可变引用.

Rust相关问答推荐

为什么要在WASM库中查看Rust函数需要`#[no_mangle]`?

这个规则关于或模式到底是什么意思?如果表达片段的类型与p_i|q_i...&q;不一致,就会形成

定义采用更高级类型泛型的性状

如何在Rust中将选项<;选项<;字符串>;转换为选项<;选项&;str>;?

为什么TcpListener的文件描述符和生成的TcpStream不同?

变量需要parse()中的显式类型

Rust proc_macro 和 syn:解析空格

为什么 Rust 创建的 f32 小于 f32::MIN_POSITIVE?

`UnsafeCell` 在没有锁定的情况下跨线程共享 - 这可能会导致 UB,对吗?

当没有实际结果时,如何在 Rust 中强制执行错误处理?

Rust: 目标成员属于哪个"目标家族"的列表是否存在?

枚举的利基优化如何在 Rust 中工作?

为什么我不能克隆可克隆构造函数的Vec?

如何获取函数中borrow 的切片的第一部分?

Rust 中 `Option` 的内存开销不是常量

判断 is_ok 后重用结果

RAII 模式的 Rust 解决方案,用于在 new() 和 drop() 上修改另一个对象

为什么 match 语句对引用类型比函数参数更挑剔?

将文件的第一行分别读取到文件的其余部分的最有效方法是什么?

如何创建动态创建值并向它们返回borrow 的工厂?