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