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 ...
}