.split_str
returns an iterator over &str
slices, that is, it is returning subviews of the row
data. The borrowed &str
is not an owned ~str
: to make this work, either collect to a ~[&str]
, or, copy each &str
into a ~str
before collecting:
let first: ~[&str] = row.split_str(",").collect();
let second: ~[~str] = row.split_str(",").map(|s| s.to_owned()).collect();
FWIW, if you're splitting on a single-character predicate, then split
will be more efficient, (e.g. row.split(',')
in this case).
Also, I recommend you upgrade to a more recent version of Rust, 0.11 was recently released, but the nightlies are the recommended install targets (change the 0.10
to 0.11
or master
in the above documentation links for the corresponding docs).
With the nightly, the two snippets above would be written as:
let first: Vec<&str> = row.split(',').collect();
let second: Vec<String> = row.split(',').map(|s| s.to_string()).collect();
(Lastly, if you're struggling with the distinction of &str
vs. ~str
aka String
, I wrote up some details a while ago.)