Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rust 获取向量尾部的惯用方法是什么?_Rust - Fatal编程技术网

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..]
(但有一个稍微不同的紧急消息)

另见

什么是“东西[1..”?!?你的问题很难回答unclear@Stargateur问题不在于“东西[1..”,而是首先必须这样做,然后打电话给国际热核实验堆,然后收取费用。我希望在Vec上会有一个方法可以获取尾部…例如stuff.tail()或stuff.take(1,2)在提供的代码中,您正在创建一个引用向量到原始向量中。这真的是你想要的吗?这是一个非常合适的方法,所以我不希望有一个我最初没有想到的专门的方法,但是你的评估。有了这些,我想不出你想要这个的理由。它与切片引用具有相同的生存期约束,但有额外的堆分配。假设您已经创建了一个向量,您需要工作with@Finlay在本例中,
stuff
可能是一个向量。关键是,您不需要创建第二个。@trentcl但是在向量上执行&stuff[1..]的行为会将它变成一个切片!如果接下来你还想用向量操作呢?@Finlay什么向量?您在问题中给出的代码收集了一个引用向量,在大多数方面,它不如只获取一个片段有用。如果需要克隆整数的向量,可以使用
to_vec
,如我在中所述。@Finlay
vec
不是递归定义的,比如“向量要么是空的,要么是
T
后跟
vec
”(您可能在其他语言中见过这样定义的列表)。相反,它被定义为。链表的“尾巴”是另一个链表,但向量的“尾巴”只是向量的一部分——它不是向量本身,因为它不拥有自己的内容,也不可增长。我们可以把一个连续的“向量的一部分”称为切片,你可以用它做一些有用的事情,不管有没有…这是一个巧妙的技巧,但在OP的情况下,这似乎不是必需的,因为他们从迭代器的开始跳过一个设定的数字,而不是从迭代器的结尾获取一个设定的数字。