Vector 有没有一种简单的方法可以从“Vec”中精确提取一个元素?

Vector 有没有一种简单的方法可以从“Vec”中精确提取一个元素?,vector,rust,Vector,Rust,我有一个对一个Vec的引用,我想从中提取一个对一个元素的引用,如果有更多的元素或零,我会惊慌失措。如果我有一个数组,那么等价物是: let[x]=列表; 但是Vecs是动态调整大小的,所以在这里不起作用。我可以想到一种方法,通过引用Vec,以及更多需要所有权的方法,但我想知道是否有一种更短更简单的方法 无主选项1:使用assert和索引 assert\u eq!(list.len(),1); 设x=&list[0]; 拥有选项1:使用try\u into() let[x]:[i32;1]=

我有一个对一个
Vec
的引用,我想从中提取一个对一个元素的引用,如果有更多的元素或零,我会惊慌失措。如果我有一个数组,那么等价物是:

let[x]=列表;
但是
Vec
s是动态调整大小的,所以在这里不起作用。我可以想到一种方法,通过引用
Vec
,以及更多需要所有权的方法,但我想知道是否有一种更短更简单的方法

无主选项1:使用
assert和索引
assert\u eq!(list.len(),1);
设x=&list[0];

拥有选项1:使用
try\u into()
let[x]:[i32;1]=列表。请尝试进入()。展开();
拥有选项2:使用
assert
pop
assert\u eq!(list.len(),1);
设x=list.pop();

那么,有没有一种更简短、更清晰的方法呢?

您可以使用()

它不一定更短,但很明显,不需要所有权或变异,并且可以很好地推广到多个要提取的元素

如果您不想惊慌失措,而是想检查元素计数并提取
x
(如果它是唯一的元素),则可以使用
If let

if let &[x] = v.as_slice() {
   // ... use x ...
}

另一件事:这两个选项都需要所有权或可变访问权,在本例中我没有。要在没有可变访问权的情况下生存,可以使用
list[0]
而不是第二个选项中的
list.pop().unwrap()
,假设向量的项目类型是
Copy
。在标题中,您要求提取值,但在问题中,您假设您的列表是精确的。你的问题的标题和主体并不重要match@Stargateur什么意思?我不明白这两个选项为何不匹配。这两个选项都需要所有权或可变访问权,在本例中我没有这两个选项-请回答问题以解释您有什么以及为什么这些选项不足。如果你想从
Vec
中获得一个拥有的
T
,你必须变异或破坏
Vec
。。。这正是所有权的含义。同样,如果let[x]=&list[..]{..
是possibility@kmdreko是的,这也行得通,我已经修改了答案,将其包括在内。匹配将是我在这里的第一个案例,因为
if let
仍然需要显式
else
(根据OP的要求),它强制使用
x
的代码缩进到一个块中。如果let
只有一个
,则后者不是什么大问题,但如果有多个,则会使代码变得难看。我不明白这个答案的目的是什么,OP要求提取一个值,你的答案与正好是一个值的片段匹配,除非我遗漏了一些内容g、 这个问题不清楚,所以你的答案在bestNote上是离题的:如果你不能移出切片,请跳过模式中的
&
。@Stargateur这个问题不仅仅是关于提取一个值,而且是关于向量不是单个元素时的恐慌。(OP还澄清了相关代码并不拥有向量。)我的答案用一段合理简短/清晰的代码展示了如何做到这一点。为什么答案会偏离主题?
if let &[x] = v.as_slice() {
   // ... use x ...
}