>我有这个:
let stuff = vec![1, 2, 3];
let tail = stuff[1..].iter().collect::<Vec<_>>();
println!("Hello, world! {:?}", tail);
我想知道这是否是惯用语,因为我发现调用iter
然后collect
冗长。
您不需要实际创建新矢量来打印值。只需使用切片。
let tail = &stuff[1..];
println!("Hello, world! {:?}", tail);
操场
您可能希望使用[T]::split_first
,它返回一个Option
而不是恐慌。这意味着您可以选择在stuff
为空时要执行的操作。
if let Some((_, tail)) = stuff.split_first() {
println!("Hello, world! {:?}", tail);
}
let (_, tail) = stuff.split_first().unwrap()
相当于let tail = &stuff[1..]
(但恐慌信息略有不同(。
参见
- 如何从 &[u8] 转换为 Vec
?
由于切片(因此Vec
(实现了DoubleEndedIterator
,你可以取一个迭代器(1,2,3,4
(,反转它(4,3,2,1
(,取一些元素(4,3,2
(并再次反转它。乍一看这似乎很奇怪,但不需要进行手动切片,也不需要考虑特殊情况:
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);
}
}