我是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
如何将块中的迭代值转换为值数组?
split()
给你从原始字符串借来的子串(字符串切片),原始字符串outputs
来自第6行.
字符串切片不能超出以下范围outputs
:当循环迭代结束时,outputs
取消分配.由于values
寿命较长,切片不能存储在那里.
我们不能借用outputs
修改的片段outputs
.因此,即使String
outputs
之前已经定义了它values
,我们也不能轻易地将字符串切片.split()
放入values
; 修改字符串(读入它)会使切片无效.
解决方案也需要
使用嵌套数组String
,当你从split迭代器中分配一个元素时,String
从&str
using使用.to_string()
.我会推荐这个解决方案.(但是一组String
数据并不容易使用,可能已经需要使用了Vec
.)1
在构造&str
从输入借用的嵌套数组之前,读取所有输入String
.如果嵌套数组只是暂时需要的,那么这很好.
1:你可以使用类似vec![vec![String::new(); 6]; 6]
代替