Ema*_*röm 2 vector rust destructure
在 JavaScript 中,我可以通过以下方式解构数组:
const [first, second, ...rest] = myArray
Run Code Online (Sandbox Code Playgroud)
Rust 是否有类似的方法来实现这一目标?
如果我只想要一个元素,那很简单。我可以:
let first = my_vec[0];
Run Code Online (Sandbox Code Playgroud)
或者,如果我从字符串创建一个数组,并且只想将 i 拆分为两部分,我可以这样做并用它获取一个元组(如果我只需要将数组拆分为两部分):
let (first, second) = my_string.split_once("\n").unwrap();
Run Code Online (Sandbox Code Playgroud)
但是更一般的解构模式怎么样,我可以忽略数组的一部分并定义一些变量并准备好使用?
我期待它看起来像这样:
let [first, second, ...] = my_vec;
Run Code Online (Sandbox Code Playgroud)
或者
let [first, ..middle, second_last, last] = my_vec;
Run Code Online (Sandbox Code Playgroud)
PS:忘记 - 部分unwrap。我知道我应该处理该错误,但这不是重点。
我尝试使用匹配表达式,但没有成功。它期望数组的长度为 2。
let [first, second] = match my_vec[..] {
[first, second] => [first, second],
v => v,
};
Run Code Online (Sandbox Code Playgroud)
我抱怨v并说: `match` arms have incompatible types expected array `[&str; 2]`, found slice `[&str]。
这是有道理的,那么有没有办法实现这一目标呢?
您可以使用match带有 as 模式的语句[first, middle @ .., last]来绑定第一个和最后一个值,并将其余的值存储在单个 array( middle)中。
fn main() {
let my_vec = vec![1, 2, 3, 4, 5];
match my_vec.as_slice() {
[first, middle @ .., last] => {
println!("{:?}, {:?}, {:?}", first, middle, last)
},
_ => {
}
}
}
Run Code Online (Sandbox Code Playgroud)
这将产生以下输出。
1, [2, 3, 4], 5
Run Code Online (Sandbox Code Playgroud)
您还可以使用if let语法:
fn main() {
let my_vec = vec!["first", "second"];
if let [first, middle @ .., last] = my_vec.as_slice() {
println!("{:?} {:?} {:?}", first, middle, last);
} else {
panic!("The slice is either empty or contains only single element")
};
}
Run Code Online (Sandbox Code Playgroud)