【问题标题】:What is the difference between tuples and array in rust?rust中的元组和数组有什么区别?
【发布时间】:2018-10-20 03:26:18
【问题描述】:

阅读初学者指南后,我能弄清楚的唯一真正区别是,在元组中你可以有多种类型的值吗?两者都是不可变的?

除了显而易见的用例之外,我想要一个元组或数组的用例是什么。

【问题讨论】:

    标签: rust


    【解决方案1】:

    数组是同类项目的列表。您可以对其进行迭代并使用动态索引对其进行索引或切片。它应该用于在代码中扮演相同角色的项目的同类集合。通常,您将在代码中至少对数组进行一次迭代。

    元组是异类项的固定长度聚合。它应该被认为是带有匿名字段的struct。字段在代码中一般有不同的含义,不能迭代。

    【讨论】:

      【解决方案2】:

      数组

      • 同类型值的集合
      • 固定大小的集合

      访问元素

      您可以通过数组的名称、方括号和索引访问数组的元素,例如:

      let arr = [22, 433, 55];
      assert_eq!(arr[0], 22);
      

      解构数组

      数组可以分解成多个变量,例如:

      let arr = [1, 42 ,309];
      let [id, code, set] = arr;
      
      assert_eq!(id, 1);
      assert_eq!(code, 42);
      assert_eq!(set, 309);
      

      元组

      • 不同类型值的集合
      • 有限异构序列

      访问元素

      您可以通过元组的名称、点和索引来访问元组的元素,例如:

      let tup = (22, "str", 55);
      assert_eq!(tup.0, 22);
      

      函数

      元组可用于从函数返回多个值,例如:

      fn num(i: u32) -> (i64, u32) {
          (-33, 33 + i)
      }
      
      assert_eq!(num(12), (-33, 45));
      

      解构元组

      元组也可以被解构,更常见的做法是解构元组而不是数组,例如:

      let tup = (212, "Wow", 55);
      let (num, word, id) = tup;
      
      assert_eq!(num, 212);
      assert_eq!(word, "Wow");
      assert_eq!(id, 55);
      

      有用的资源:

      【讨论】:

      • 另一方面,固定长度的数组也可以被解构——这两种类型之间并没有真正的区别。不过,解构元组更为常见。
      • 我说过,最重要的区别显示在另一个答案中:数组可以迭代、切片、按变量索引等,而我们对元组所能做的就是解构和常量索引.换句话说,数组的内容有限,但使用起来更加灵活。
      【解决方案3】:

      元组:

      • 项目可以是异构类型
      • 固定项目数
      • 通过. 语法进行索引,例如myTuple.0 用于第一个元素
      • 仅使用 mut 关键字可变

      数组:

      • 商品类型相同
      • 固定项目数
      • 通过[] 语法进行索引,例如myArr.[0] 用于第一个元素
      • 仅使用 mut 关键字可变

      示例:

      对于示例,我已经明确声明了类型,因此您可以了解变量的类型。在您的代码中,您可以将它们排除在外 通常是因为编译器会推断它们。

      fn main() {
          let mut tupleA: (i32, i32, &str) = (3434, 5634, "abc");    
          let tupleB: (char, i32, bool) = ('d', 456, false);    
      
          let mut arrayA: [i32; 3] = [1,2,3];
          let arrayB: [bool; 4] = [false, true, false, true];
      
          tupleA.1 = 5;
          arrayA[0] = 5;
      
          println!("{:?} {:?} {:?} {:?}", tupleA, tupleB, arrayA, arrayB)
          // prints (3434, 5, "abc") ('d', 456, false) [5, 2, 3] [false, true, false, true]
      
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-12
        相关资源
        最近更新 更多