我有一个对Vec
的引用,我想从中提取一个对一个元素的引用,如果有更多的元素或零,则会出现恐慌。如果我有一个数组,则等效于:
let [x] = list;
字符串
但是Vec
的大小是动态的,所以在这里不起作用。我可以想到一种方法来引用Vec
,还有几种需要所有权的方法,但是我想知道是否有一种更短更简单的方法。
Unowned选项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();
型
那么,有没有更简单、更明确的方法呢?
2条答案
按热度按时间vs91vp4v1#
您可以将slice pattern与
let else
结合使用:字符串
Playground的
它不一定比您的选项短,但它清晰且相当简洁,不需要所有权或变更,并且可以很好地概括为多个元素进行提取。
如果你不想惊慌,而是想检查元素计数并提取
x
(如果它是唯一的元素),你可以使用if let
:型
已编辑
这个答案最初建议使用更详细的
match
语法,在Rust 1.65中引入let else
之前,这是强制性的。如果您正在为支持旧编译器的项目做出贡献,或者如果您发现let else
不受欢迎,它仍然很有用:型
sgtfey8w2#
使用
itertools
,适用于自有和非自有版本:字符串