Rust 数组
最后修改于 2025 年 2 月 19 日
在本文中,我们将展示如何在 Rust 中使用数组。
一个 数组 是相同类型元素的固定集合。每个元素都可以通过索引来引用。索引是基于零的。(第一个元素的索引是零。)
数组是用一对 `[]` 方括号创建的。
数组的类型是 `[T; length]`。
数组初始化
在第一个示例中,我们在 Rust 中初始化数组。
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` 函数来确定。
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]` 来访问。
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` 函数返回一个元素或子切片的引用。
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]
修改数组元素
在下一个示例中,我们修改数组的元素。
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 循环,我们可以轻松地遍历数组的元素。
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` 函数过滤数组。
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]
排序数组
在下一个示例中,我们对数组进行排序。排序是稳定的且是破坏性的。
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 中使用数组。
作者
列出 所有 Rust 教程。