美文网首页
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