代码:

pub fn iter(&self) -> impl Iterator<Item = (&usize, &T)> + '_ {
    self.values.iter().map(|(key, value)| (key, value))
}

here点算起,以下内容似乎就足够了:

pub fn iter(&self) -> impl Iterator<Item = (&usize, &T)> + '_ {
    self.values.iter()
}

有什么不同吗?

推荐答案

是的,前者返回实现Iterator<Item = (&usize, &T)> + '_的类型,而后者返回实现Iterator<Item = &(usize, T)> + '_的类型.

下面是一个最小的例子:

pub fn iter1(v: &[(usize, i32)]) -> impl Iterator<Item = (&usize, &i32)> + '_ {
    v.iter().map(|(key, value)| (key, value))
}

pub fn iter2(v: &[(usize, i32)]) -> impl Iterator<Item = (&usize, &i32)> + '_ {
    v.iter()
}

编译失败,并显示以下错误消息:

error[E0271]: expected `std::slice::Iter<'_, (usize, i32)>` to be an iterator that yields `(&usize, &i32)`, but it yields `&(usize, i32)`
 --> src/lib.rs:5:37
  |
5 | pub fn iter2(v: &[(usize, i32)]) -> impl Iterator<Item = (&usize, &i32)> + '_ {
  |                                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `&(usize, i32)`, found tuple
6 |     v.iter()
  |     -------- return type was inferred to be `std::slice::Iter<'_, (usize, i32)>` here
  |
  = note: expected reference `&(usize, i32)`
                 found tuple `(&usize, &i32)`

For more information about this error, try `rustc --explain E0271`.
error: could not compile `playground` due to previous error

Playground.

前者之所以有效,是因为Rust的模式语法中内置了人体工程学,称为binding modes:

当参考值与非参考模式匹配时,它将被自动视为REF或REF MUT绑定.

所以它基本上是 v.iter().map(|&(ref key, ref value)| (key, value))的句法糖,这就更清楚地说明了为什么前者有效,而后者不行.

Rust相关问答推荐

Tauri tauri—apps/plugin—store + zustand

Rust kill std::processs::child

如何从Rust记录WASM堆内存使用情况?

为什么类型需要在这个代码中手动指定,在rust?

如何指定不同的类型来常量Rust中的泛型参数?

如何在 struct 的自定义序列化程序中使用serde序列化_WITH

为昂贵的for循环制作筛子

关于 map 闭合求和的问题

处理带有panic 的 Err 时,匹配臂具有不兼容的类型

&'a T 是否意味着 T: 'a?

使用 pyo3 将 Rust 转换为 Python 自定义类型

Rust ECDH 不会产生与 NodeJS/Javascript 和 C 实现相同的共享密钥

如何将这些测试放在一个单独的文件中?

将 Futures 的生命周期特征绑定到 fn 参数

`use std::error::Error` 声明中断编译

如何存储返回 Future 的闭包列表并在 Rust 中的线程之间共享它?

使用泛型作为关联类型,没有幻像数据

Rust:如果我知道只有一个实例,那么将可变borrow 转换为指针并返回(以安抚borrow 判断器)是否安全?

为什么 Rust 标准库同时为 Thing 和 &Thing 实现特征?

有什么办法可以用 Rust 访问 Windows 最近的文件夹吗?