Rust 获取向量尾部的惯用方法是什么?
我有这个:Rust 获取向量尾部的惯用方法是什么?,rust,Rust,我有这个: let stuff=vec![1, 2, 3]; 让tail=stuff[1...iter().collect::(); 普林顿!(“你好,世界!{:?}”,尾巴); 我想知道这是否是惯用的,因为我发现调用iter,然后调用collectverbose 您不需要实际创建新向量来打印值。就用一片吧 let tail = &stuff[1..]; println!("Hello, world! {:?}", tail); 由于切片(因此Vec)实现,您可以使用迭代器(1,2,
let stuff=vec![1, 2, 3];
让tail=stuff[1...iter().collect::();
普林顿!(“你好,世界!{:?}”,尾巴);
我想知道这是否是惯用的,因为我发现调用
iter
,然后调用collect
verbose 您不需要实际创建新向量来打印值。就用一片吧
let tail = &stuff[1..];
println!("Hello, world! {:?}", tail);
由于切片(因此Vec
)实现,您可以使用迭代器(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);
}
}
您可能希望使用,它返回一个选项
,而不是惊慌失措。这意味着您可以选择在stuff
为空时执行的操作
if let Some((_, tail)) = stuff.split_first() {
println!("Hello, world! {:?}", tail);
}
let(u,tail)=stuff.split_first().unwrap()
相当于let tail=&stuff[1..]
(但有一个稍微不同的紧急消息)
另见
stuff
可能是一个向量。关键是,您不需要创建第二个。@trentcl但是在向量上执行&stuff[1..]的行为会将它变成一个切片!如果接下来你还想用向量操作呢?@Finlay什么向量?您在问题中给出的代码收集了一个引用向量,在大多数方面,它不如只获取一个片段有用。如果需要克隆整数的向量,可以使用to_vec
,如我在中所述。@Finlayvec
不是递归定义的,比如“向量要么是空的,要么是T
后跟vec
”(您可能在其他语言中见过这样定义的列表)。相反,它被定义为。链表的“尾巴”是另一个链表,但向量的“尾巴”只是向量的一部分——它不是向量本身,因为它不拥有自己的内容,也不可增长。我们可以把一个连续的“向量的一部分”称为切片,你可以用它做一些有用的事情,不管有没有…这是一个巧妙的技巧,但在OP的情况下,这似乎不是必需的,因为他们从迭代器的开始跳过一个设定的数字,而不是从迭代器的结尾获取一个设定的数字。