有没有一种简单的方法可以从`Vec`中精确提取一个元素?
我有一个对 a 的引用Vec,我想从中提取对一个元素的引用,如果有更多元素或零,则恐慌。如果我有一个数组,则等效为:
let [x] = list;
但是Vecs 是动态调整大小的,因此在这里不起作用。我可以想到一种方法来引用 a Vec,还有一些需要所有权的方法,但我想知道是否有更短更简单的方法。
未拥有的选项 1:使用assert!和索引
assert_eq!(list.len(), 1);
let x = &list[0];
拥有的选项 1:使用 try_into()
let [x]: [i32; 1] = list.try_into().unwrap();
拥有的选项 2:使用assert!和pop
assert_eq!(list.len(), 1);
let x = list.pop();
那么,有没有更短更清晰的方法呢?
回答
您可以使用切片模式(playground):
let v = vec![1u32];
let x = match v.as_slice() {
&[x] => x,
_ => panic!("expected single element"),
};
// ... use x ...
它不一定更短,但很明显,不需要所有权或变异,并且可以很好地推广到多个要提取的元素。
如果您想检查元素计数并提取x它是否是唯一的元素而不是恐慌,则可以使用if let:
if let &[x] = v.as_slice() {
// ... use x ...
}