获取向量尾巴的惯用方法是什么?



>我有这个:

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);
}
}

相关内容

最新更新