I\'m new to Rust and looking to understand concepts like borrowing. I\'m trying to create a simple two dimensional array using standard input. The code:
use
This answer was moved from the question, where it solved the OPs needs.
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;
}
}
}
split()
gives you substrings (string slices) borrowed from the original string, and the original string is outputs
from line 6.
outputs
: when a loop iteration ends, outputs
is deallocated.
Since values
is longer lived, the slices can't be stored there.outputs
across a modification of outputs
. So even if the String
outputs
itself was defined before values
, we couldn't easily put the string slices from .split()
into values
; modifying the string (reading into it) invalidates the slices.A solution needs to either
String
, and when you assign an element from the split iterator, make a String
from the &str
using .to_string()
. I would recommend this solution. (However an array of String
is not at as easy to work with, maybe already this requires using Vec
instead.) 1&str
that borrows from the input String
. This is good if the nested array is something that you only need temporarily.1: You can use something like vec![vec![String::new(); 6]; 6]
instead