Rust中元组和数组有什么区别?

17

在阅读初学者指南后,我能想到的真正区别是:在元组中,你可以拥有多个类型的值? 两者都是不可变的吗?

那么,在除了显而易见的情况之外,我何时需要使用元组或数组?

3个回答

23

数组是同类型物品的列表。你可以使用动态索引遍历、索引、或切片它。它应该用于代码中扮演相同角色的同质集合。通常,在您的代码中至少需要一次迭代数组。

元组是异构项的固定长度聚合。应该将其视为带有匿名字段的struct。在代码中,这些字段通常具有不同的含义,且无法迭代。


16

数组

  • 相同类型值的集合
  • 固定长度的集合

访问元素

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

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

有用的资源:


2
顺便提一下,定长数组也可以被解构 - 这并不是这两种类型之间的真正区别。不过,解构元组更为常见。 - Sven Marnach
我曾经说过,最重要的区别在于另一个答案中所展示的:数组可以被迭代、切片、通过变量进行索引等等,而我们能够对元组做的只有解构和常量索引。换句话说,数组在内容上受到限制,但在使用上更加灵活。 - Cerberus

1

元组:

  • 项可以是不同类型
  • 有固定数量的项
  • 通过.语法进行索引,例如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]

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接