如何在rust中将n项从vec in分解为变量

u5i3ibmn  于 2022-12-19  发布在  其他
关注(0)|答案(2)|浏览(170)

在javascript中,我可以用下面的方法来解构一个数组:
第一个月
有没有类似的方法来实现这一点在生 rust ?
如果我只想要一种元素,那很简单。我可以做到:
let first = my_vec[0]
或者如果我用一个字符串创建一个数组,只想把i拆分一次,拆分成两部分,得到一个元组:
let (first, second) = my_string.split_once("\n").unwrap();(如果我只需要将数组拆分为两部分)
但是更一般的解构模式怎么样呢?在这种模式中,我可以忽略数组的一部分,定义一些变量并准备好使用。
我希望它看起来像这样:
let [first, second, ...] = my_vec;

let [first, ..middle, second_last, last] = my_vec;
忘了unwrap部分吧。我知道我应该处理这个错误,但这不是重点。
我尝试使用匹配表达式,但不起作用。它要求数组的长度为2。

let [first, second] = match my_vec[..] {
        [first, second] => [first, second],
        v => v,
      
    };

我抱怨v并说:``matcharms have incompatible types expected array[&str; 2], found slice[&str]` .这是有道理的,那么有没有办法实现呢?

nqwrtyyt

nqwrtyyt1#

好的,我在rust中找到了一个从数组(vec)中反结构任意项的方法。它并不完美。如果索引不反弹,程序会崩溃。
第一个月
我还发现你可以做字符串切片,但据我所知,我只能取范围,而不能挑选,至少不能不冗长和复杂。
let [first, second, third]: &[_; 3] = my_vec[..3].try_into().unwrap();

holgip5t

holgip5t2#

您可以使用match和以下模式。

[first, middle @ .., last]

以绑定first and last values, and store the rest of them in a single 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)
        },
        _ => {

        }
    }
}

这将导致以下输出。

"first", ["second"], "third"

您也可以使用if let syntax.

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")
    };
}

相关问题