美文网首页
rust for 循环

rust for 循环

作者: book_02 | 来源:发表于2022-03-10 15:28 被阅读0次

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 迭代器的类型和返回值

  1. iter(), 返回的是值的不可变引用, 即 &T.
  2. iter_mut(), 返回的是值的可变引用, 即 &mut T.
  3. 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);
    }

相关文章

网友评论

      本文标题:rust for 循环

      本文链接:https://www.haomeiwen.com/subject/qogfdrtx.html