【问题标题】:How to destructure n items from vec in to variables in rust如何将 vec 中的 n 项解构为 rust 中的变量
【发布时间】:2022-12-22 07:21:39
【问题描述】:

在 javascript 中,我可以通过以下方式解构数组:

const [first, second, ...rest] = myArray

有没有类似的方法可以在生锈中实现这一点?

如果我只想要一个元素,那很容易。我可以:

let first = my_vec[0]

或者如果我从一个字符串创建一个数组并且只想将我拆分一次,分成两部分我可以这样做并得到一个元组:

let (first, second) = my_string.split_once("\n").unwrap();(如果我只需要将数组分成两部分)

但是,更通用的解构模式又如何呢?在这种模式中,我可以忽略数组的某些部分并定义一些变量并准备好使用?

我期待它看起来像这样:

let [first, second, ...] = my_vec;

或者

let [first, ..middle, second_last, last] = my_vec;

P.S 忘记 unwrap 部分。我知道我应该处理这个错误,但这不是这里的重点。

我尝试使用匹配表达式,但没有用。它期望数组的长度为 2。


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

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

【问题讨论】:

    标签: arrays rust vec destructure


    【解决方案1】:

    OP 代码中的 v => v 匹配臂与第一个匹配臂的类型不兼容。使用match时,所有匹配臂的结果类型必须兼容,但我们可以使用panic!来使分支发散。

    fn main() {
        let my_vec = vec!["first", "second"];
        let [first, second] = match my_vec[..] {
            [first, second] => [first, second],
            _ => panic!("match failed"),
        };
    }
    

    【讨论】:

      【解决方案2】:

      好的,我找到了一种方法来解构 rust 数组 (vec) 中的任意条目。 这并不完美。如果索引不反弹,程序就会崩溃。

      let [first, second, fifth] = { [my_vec[0], my_vec[1], my_vec[5]] };

      我还发现你可以做字符串切片,但据我所知,我只能取范围,不能挑选。至少不是没有冗长和复杂的。

      let [first, second, third]: &[_; 3] = my_vec[..3].try_into().unwrap();

      【讨论】:

        【解决方案3】:

        您可以将 match 与以下模式一起使用。

        [first, middle @ .., last]
        

        绑定first and last values, and store the rest of them in a single array(middle)

        IE,

        fn main() {
            let my_vec = vec![1, 2, 3, 4, 5];
            match my_vec.as_slice() {
                [first, middle @ .., last] => {
                    println!("{:?}, {:?}, {:?}", first, middle, last)
                },
                _ => {
        
                }
            }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-07-12
          • 1970-01-01
          • 2018-01-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-06-11
          相关资源
          最近更新 更多