当前位置:  开发笔记 > 后端 > 正文

如何在Rust中迭代和提取for循环中的值

如何解决《如何在Rust中迭代和提取for循环中的值》经验,为你挑选了1个好方法。

我是Rust的新手,希望了解借用等概念.我正在尝试使用标准输入创建一个简单的二维数组.代码:

use std::io;

fn main() {
    let mut values = [["0"; 6]; 6]; // 6 * 6 array

    // iterate 6 times for user input
    for i in 0..6 {
        let mut outputs = String::new();
        io::stdin().read_line(&mut outputs).expect(
            "failed to read line",
        );

        // read space separated list 6 numbers. Eg: 5 7 8 4 3 9
        let values_itr = outputs.trim().split(' ');
        let mut j = 0;
        for (_, value) in values_itr.enumerate() {
            values[i][j] = value;
            j += 1;
        }
    }
}

这将无法编译,因为outputs变量生命周期不够长:

error[E0597]: `outputs` does not live long enough
  --> src/main.rs:20:5
   |
14 |         let values_itr = outputs.trim().split(' ');
   |                          ------- borrow occurs here
...
20 |     }
   |     ^ `outputs` dropped here while still borrowed
21 | }
   | - borrowed value needs to live until here

如何将块中的迭代值转换为值数组?



1> bluss..:

split()给你从原始字符串借来的子串(字符串切片),原始字符串outputs来自第6行.

    字符串切片不能超出以下范围outputs:当循环迭代结束时,outputs取消分配.由于values寿命较长,切片不能存储在那里.

    我们不能借用outputs修改的片段outputs.因此,即使String outputs之前已经定义了它values,我们也不能轻易地将字符串切片.split()放入values; 修改字符串(读入它)会使切片无效.

解决方案也需要

使用嵌套数组String,当你从split迭代器中分配一个元素时,String&strusing使用.to_string().我会推荐这个解决方案.(但是一组String数据并不容易使用,可能已经需要使用了Vec.)1

在构造&str从输入借用的嵌套数组之前,读取所有输入String.如果嵌套数组只是暂时需要的,那么这很好.

1:你可以使用类似vec![vec![String::new(); 6]; 6]代替

推荐阅读
家具销售_903
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有