rust - `(i, &item)` 在使用 enumerate() 的 for 循环中是什么意思?
问题描述
我正在阅读 Rust 文档,我看到了这段代码:
fn first_word(s: &String) -> &str {
let bytes = s.as_bytes();
println!("{:?}", bytes.iter().enumerate());
for (i, &item) in bytes.iter().enumerate() {
println!("{}", i);
if item == b' ' {
print!("{}", &s[0..i]);
break;
}
}
&s[..]
}
fn main() {
let amir = String::from("amir ali ahmadi");
first_word(&amir);
println!("{:?}", b" ")
}
为什么是i
索引?
为什么是&item
价值?
解决方案
当你调用enumerate()
一个迭代器时,你会得到一个 的实例Enumerate
,它的结构定义如下:
pub struct Enumerate<I> {
iter: I,
count: usize,
}
换句话说,Enumerate
简单地包装原始迭代器以及一个count
跟踪将从迭代器获取的下一个索引的字段。(在 Enumerate 文档中有指向源代码的链接。)
每次for
循环调用next()
时Enumerate
,它都会执行此方法:
fn next(&mut self) -> Option<(usize, <I as Iterator>::Item)> {
let a = self.iter.next()?;
let i = self.count;
// Possible undefined overflow.
AddAssign::add_assign(&mut self.count, 1);
Some((i, a))
}
这将返回一个Option::Some
包含 tuple 的(i, a)
。的值i
等于count
字段,因此等于当前迭代器索引。并且 的值a
等于对iter.next()
原始迭代器的调用返回的值。该add_assign
函数具有将count
字段值增加 1 的效果。
请注意,?
调用后的iter.next()
意思是如果迭代器不再包含项目,Option::None
则将改为返回,并且该方法将完成。
正如对您的问题的评论中所指出的,当您打印Enumerate
实例的调试输出时,您将看到嵌套的迭代器和count
字段:
{
iter: Iter([97, 109, 105, 114, 32, 97, 108, 105, 32, 97, 104, 109, 97, 100, 105]),
count: 0
}
推荐阅读
- python-3.x - 在 Mac 上安装 spaCy 包:错误:命令“gcc”失败,退出状态为 1
- reactjs - 邮递员工作但reactjs fetch不起作用
- node.js - 续集和客户端html
- javascript - javascript 从 aws lambda 查询 dynamodb 中的最后一项
- json - Kubernetes 节点上的工作流
- c# - 管理应用程序以检查另一个应用程序的状态
- text - 如何保留某些行号并删除其余行号
- python-3.x - python valueError write()
- api - 如何获取 Digital Ocean Spaces 中的文件夹大小
- c# - OData HttpPost -> 请求数据一如既往地为模型对象传递 null