我是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
如何将块中的迭代值转换为值数组?
答案 0 :(得分:6)
split()
为您提供从原始字符串借用的子字符串(字符串切片),原始字符串为第6行的outputs
。
outputs
的范围:当循环迭代结束时,outputs
被释放。
由于values
的寿命较长,因此切片无法存储在那里。outputs
的修改中借用outputs
的切片。因此,即使在String
之前定义了outputs
values
本身,我们也无法轻松地将.split()
中的字符串切片放入values
;修改字符串(读入它)会使切片无效。解决方案需要
String
的嵌套数组,当您从拆分迭代器中分配元素时,使用String
从&str
创建.to_string()
。我会推荐这个解决方案。 (但是String
数组并不容易使用,可能已经需要使用Vec
。) 1 &str
借用的String
嵌套数组之前,先阅读所有输入。如果嵌套数组只是暂时需要的东西,那么这很好。 1 :您可以使用类似vec![vec![String::new(); 6]; 6]
的内容
答案 1 :(得分:1)
这个答案从问题中解决了,它解决了OP的需求。
use std::io;
fn main() {
let mut values = vec![vec![String::new(); 6]; 6];
for i in 0..6 {
let mut outputs = String::new();
io::stdin().read_line(&mut outputs)
.expect("failed to read line");
let values_itr = outputs.trim().split(' ');
let mut j = 0;
for (_, value) in values_itr.enumerate() {
values[i][j] = value.to_string();
j += 1;
}
}
}