有没有一种简单的方法可以从`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 ...
}


以上是有没有一种简单的方法可以从`Vec`中精确提取一个元素?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>