1. 参考
https://blog.csdn.net/FlyingKiss007/article/details/93897200
https://doc.rust-lang.org/stable/std/iter/
https://gongdear.com/articles/2020/12/28/1609152963317.html
2. 前置说明
2.1 迭代器的类型和返回值
- iter(), 返回的是值的不可变引用, 即 &T.
- iter_mut(), 返回的是值的可变引用, 即 &mut T.
- into_iter(), 返回的是T类型的值, 即 T.
2.2 自动解引用
rust有自动引用和解引用的功能,所以在有些地方使用会iter()
、iter_mut()
、into_iter()
的使用在引用部分造成理解混淆
println! 宏可以自动解引用
详细说明参见下面的链接:
rust自动解引用与强制解引用
https://softs.im/rust%E8%87%AA%E5%8A%A8%E8%A7%A3%E5%BC%95%E7%94%A8%E4%B8%8E%E5%BC%BA%E5%88%B6%E8%A7%A3%E5%BC%95%E7%94%A8/
3. 一些常见用法
3.1 into_iter() 方法或 iter() 方法 : 值不可修改
有多种写法,还有一个语法糖写法,下面从简单到容易逐个写出来
1) 语法糖写法
let values = vec![1, 2, 3, 4, 5];
for value in values {
//value值不可修改
println!("value = {}", value);
}
这里能直接这样写是因为数组Vec实现了IntoIterator
,这样写就相当于values.into_iter()
详细可参考:
https://doc.rust-lang.org/stable/std/iter/
2) into_iter()
let values = vec![1, 2, 3, 4, 5];
for value in values.into_iter() {
//value值不可修改
println!("value = {}", value);
}
3) iter()
let values = vec![1, 2, 3, 4, 5];
for value in values.iter() {
//value值不可修改
println!("value = {}", value);
}
注意iter()
返回的是值的不可变引用
这里println!("value = {}", value);
更精准的写法应为println!("value = {}", *value);
因为 println! 宏可以自动解引用,所以写成 println!("value = {}", value);
也可以
iter()
也有语法糖写法,如下:
在values
前加上引用符号&
, 这样value就是个值引用
let values = vec![1, 2, 3, 4, 5];
for value in &values { // same as `values.iter()`
//value值不可修改
println!("value = {}", value);
}
4) 逆序读取
let values = vec![1, 2, 3, 4, 5];
for value in values.iter().rev() {
//value值不可修改
println!("value = {}", value);
}
3.2 iter_mut()方法 : 值可修改
1) 语法糖写法
let mut values = vec![1, 2, 3, 4, 5];
for value in &mut values { // same as `values.iter_mut()`
//value值可修改
*value += 1;
println!("value = {}", value);
}
2) iter_mut()
let mut values = vec![1, 2, 3, 4, 5];
for value in values.iter_mut() {
//value值可修改
*value += 1;
println!("value = {}", value);
}
3) 逆序读取修改:
let mut values = vec![1, 2, 3, 4, 5];
for value in values.iter_mut().rev() {
//value值可修改
*value += 1;
println!("value = {}", value);
}
3.3 enumerate() : 带索引
1) 值不可修改
let values = vec![1, 2, 3, 4, 5];
for (index, value) in values.iter().enumerate() {
//value值不可修改
println!("index = {}; value = {}", index, value);
}
2) 值可修改
let mut values = vec![1, 2, 3, 4, 5];
for (index, value) in values.iter_mut().enumerate() {
//value值可修改
*value += 1;
println!("index = {}; value = {}", index, value);
}
3.4 限制前n条数据
使用 take()
取前3个值
let values = vec![1, 2, 3, 4, 5];
for value in values.iter().take(3) {
println!("value = {}", value);
}
网友评论