ZetCode

Rust 数组

最后修改于 2025 年 2 月 19 日

在本文中,我们将展示如何在 Rust 中使用数组。

一个 数组 是相同类型元素的固定集合。每个元素都可以通过索引来引用。索引是基于零的。(第一个元素的索引是零。)

数组是用一对 `[]` 方括号创建的。

数组的类型是 `[T; length]`。

数组初始化

在第一个示例中,我们在 Rust 中初始化数组。

main.rs
fn main() {

    let vals: [i32; 5] = [1, 2, 3, 4, 5];
    println!("{:?}", vals);

    let words = ["soup", "falcon", "water", "tree"];
    println!("{:?}", words);

    let vals2: [i32; 10] = [3; 10];
    println!("{:?}", vals2);

    let vals3 = [0; 5];
    println!("{:?}", vals3);
}

在示例中,我们定义了四个数组。

let vals: [i32; 5] = [1, 2, 3, 4, 5];

我们定义了一个包含五个 `i32` 整数的数组。我们显式地使用 `[i32; 5]` 指定了数组类型。在赋值的右侧,我们在 `[]` 方括号内指定了数组元素。元素之间用逗号分隔。

println!("{:?}", vals);

我们将数组的内容打印到控制台。

let words = ["soup", "falcon", "water", "tree"];

我们定义了一个字符串数组。类型声明被省略了;Rust 会根据赋值右侧自动推断类型。

let vals2: [i32; 10] = [3; 10];

这里我们定义了一个包含十个相同值的整数数组;在我们的例子中,数组的所有位置都填充了数字 3。

let vals3 = [0; 5];
println!("{:?}", vals3);

第二种语法也允许省略类型声明。

λ cargo run -q
[1, 2, 3, 4, 5]
["soup", "falcon", "water", "tree"]
[3, 3, 3, 3, 3, 3, 3, 3, 3, 3]
[0, 0, 0, 0, 0]

数组长度

数组的长度可以通过 `len` 函数来确定。

main.rs
fn main() {
    let vals = [1, 2, 3, 4, 5];
    let n = vals.len();
    println!("The length of the array is {n}");

    let words = ["soup", "falcon", "water", "tree"];
    let n2 = words.len();
    println!("The length of the array is {n2}");
}

在示例中,我们确定了两个数组的大小。

λ cargo run -q
The length of the array is 5
The length of the array is 4

访问数组元素

数组元素通过数组访问表示法 `[i]` 来访问。

main.rs
fn main() {
    let vals = [1, 2, 3, 4, 5];

    let n = vals.len();

    println!("The first element is: {}", vals[0]);
    println!("The second element is: {}", vals[1]);
    println!("The last element is: {}", vals[n-1]);

    println!("-----------------------");

    println!("The first element is: {}", vals.first().unwrap());
    println!("The last element is: {}", vals.last().unwrap());
}

要访问数组元素,我们指定数组名称,后跟一对 `[]` 方括号,其中放入元素的索引。

println!("The first element is: {}", vals[0]);

我们打印第一个元素。

println!("The last element is: {}", vals[n-1]);

最后一个元素可以通过计算数组长度并减去 1 来获得。

println!("The first element is: {}", vals.first().unwrap());
println!("The last element is: {}", vals.last().unwrap());

还有方便的 `first` 和 `last` 函数。

λ cargo run -q
The first element is: 1
The second element is: 2
The last element is: 5
-----------------------
The first element is: 1
The last element is: 5

Rust 数组 get

`get` 函数返回一个元素或子切片的引用。

main.rs
fn main() {
    let vals = [1, 2, 3, 4, 5];

    let first = vals.get(0).unwrap();
    let first_two = vals.get(0..2).unwrap();

    println!("The first element is: {}", first);
    println!("The first two elemetns: {:?}", first_two);
}

在示例中,我们使用 `get` 函数检索第一个元素,然后是前两个元素。

let first_two = vals.get(0..2).unwrap();

如果我们传递一个范围给 `get`,我们就会得到一个子切片。

λ cargo run -q
The first element is: 1
The first two elemetns: [1, 2]

修改数组元素

在下一个示例中,我们修改数组的元素。

main.rs
fn main() {
    let mut vals: [i32; 5] = [0; 5];

    println!("{:?}", vals);

    vals[0] = 5;
    vals[1] = 6;
    vals[2] = 7;
    vals[3] = 8;
    vals[4] = 9;

    println!("{:?}", vals);
}

我们定义了一个可变的整数数组。之后,我们将元素修改为新值。

let mut vals: [i32; 5] = [0; 5];

定义了一个包含五个零的可变数组。

vals[0] = 5;
vals[1] = 6;
vals[2] = 7;
vals[3] = 8;
vals[4] = 9;

元素通过数组索引表示法进行修改。数组中有五个元素;第一个索引为 0,第五个索引为 4。

λ cargo run -q
[0, 0, 0, 0, 0]
[5, 6, 7, 8, 9]

数组循环

使用 for 循环,我们可以轻松地遍历数组的元素。

main.rs
fn main() {
    let vals = [1, 2, 3, 4, 5];

    for e in vals {
        println!("{e}");
    }

    let n = vals.len();

    for i in 0..n {
        println!("{} -> {}", i, vals[i]);
    }

    for e in vals.iter().enumerate() {
        let (i, x) = e;
        println!("vals[{i}] = {x}");
    }
}

程序会遍历数组的元素三次。

for e in vals {
    println!("{e}");
}

在第一种情况下,我们只是逐个遍历元素。在每次 for 循环中,`e` 包含当前元素。

let n = vals.len();

for i in 0..n {
    println!("{} -> {}", i, vals[i]);
}

在第二种情况下,我们通过创建数组索引值范围来遍历数组。

for e in vals.iter().enumerate() {
    let (i, x) = e;
    println!("vals[{i}] = {x}");
}

`enumerate` 函数创建一个迭代器,该迭代器提供当前索引和当前值。

λ cargo run -q
1
2
3
4
5
0 -> 1
1 -> 2
2 -> 3
3 -> 4
4 -> 5
vals[0] = 1
vals[1] = 2
vals[2] = 3
vals[3] = 4
vals[4] = 5

过滤数组

我们可以使用 `filter` 函数过滤数组。

main.rs
fn main() {
    let vals = [1, -2, -3, 4, 5];

    let res: Vec<_> = vals.iter().filter(|&e| *e > 0).collect();
    println!("{:?}", res);
}

在程序中,我们定义了一个整数数组。我们过滤掉所有正值。

λ cargo run -q
[1, 4, 5]

排序数组

在下一个示例中,我们对数组进行排序。排序是稳定的且是破坏性的。

main.rs
fn main() {
    let mut vals = [5, -2, -3, 4, 1, 2];

    vals.sort();
    println!("{:?}", vals);

    let mut words = ["war", "atom", "be", "it", "cup", "forest", "book"];

    words.sort_by(|e1, e2| e1.len().cmp(&e2.len()));
    println!("{:?}", words);
}

程序对整数数组和字符串数组进行排序。

vals.sort();

使用 `sort`,我们对整数进行原地排序。

words.sort_by(|e1, e2| e1.len().cmp(&e2.len()));

在第二种情况下,我们按长度对字符串进行排序。

λ cargo run -q
[-3, -2, 1, 2, 4, 5]
["be", "it", "war", "cup", "atom", "book", "forest"]

在本文中,我们学习了如何在 Rust 中使用数组。

作者

我叫 Jan Bodnar,是一名充满激情的程序员,拥有丰富的编程经验。自 2007 年以来,我一直撰写编程文章。迄今为止,我已撰写了 1400 多篇文章和 8 本电子书。我在编程教学方面拥有十多年的经验。

列出 所有 Rust 教程