I have this:
let stuff = vec![1, 2, 3];
let tail = stuff[1..].iter().collect::<Vec<_>>();
println!("Hello, world! {:?}", tail);
I was wondering if this is idiomatic, as I find the call to iter
and then to collect
verbose.
I have this:
let stuff = vec![1, 2, 3];
let tail = stuff[1..].iter().collect::<Vec<_>>();
println!("Hello, world! {:?}", tail);
I was wondering if this is idiomatic, as I find the call to iter
and then to collect
verbose.
You don't need to actually create a new vector to print the values. Just use a slice.
let tail = &stuff[1..];
println!("Hello, world! {:?}", tail);
You may want to use [T]::split_first
, which returns an Option
rather than panicking. This means you can choose what to do if stuff
is empty.
if let Some((_, tail)) = stuff.split_first() {
println!("Hello, world! {:?}", tail);
}
let (_, tail) = stuff.split_first().unwrap()
would be equivalent to let tail = &stuff[1..]
(but with a slightly different panic message).
Since slices (and therefor Vec
) implement DoubleEndedIterator
, you can take an iterator (1,2,3,4
), reverse it (4,3,2,1
), take a number of elements (4,3,2
) and reverse it again. This might seem strange at first, yet no manual slicing needs to be done and no special cases need to be considered:
fn main() {
let v = vec![1,2,3,4,5];
// Will print the last 3 elements in order; "3,4,5"
for x in v.iter().rev().take(3).rev() {
println!("{}", x);
}
}