初面网初面网

元组与数组

元组

小括号里,值用逗号分开。每个位置对应一个类型,各元素类型可以不同。

let tup: (i32, f64, u8) = (500, 6.4, 1);

println!("{},{},{}", tup.0, tup.1, tup.2);

// 解构的方式赋值
let (x,y,z) = tup;
println!("{},{},{}", x, y, z);

数组

跟元组类似,但是元素类型相同,长度固定。

想让数据存放在stack上而不是heap上时用数组更好。

let arr = [1,2,3,4,5];

// 声明类型的方式: [类型;长度]
let a:[i32; 5] = [1,2,3,4,5];

// 每个元素都相同时可以这样赋值
let a = [3:5];  // 相当于let a = [3,3,3,3,3];

// 访问时用下标
println!(a[2]);

// 如果越界,编译会通过,运行会报错

假设您需要申请特别大的数组,那么可以如下书写:

fn main(){
  // 适用于数组内都是相同值的情况。
  let my_arr: [u32; 32 * 1024] = [0; 32 * 1024];
  println!("{}",my_arr[1023]);
}

想修改数组的话,需要加上mut关键字。

fn main(){
  let mut my_arr: [i32;4] = [1,2,3,4];
  my_arr[0] = 100;
  println!("{}",my_arr[0]);
}

如果需要存放不定长的数据,使用Vector(由标准库提供)是更好的选择。

切片

从一段数据中(例如,数组),裁切一段下来。

// 字符串切片
let s = String::from ("helloworld");

let head = &s[0..5];
let tail = &s[5..s.len()];

println!("{}", head);
println!("{}", tail);
println!("{} {}", head, tail)

// ..可以用来表示范围。
// ..y 等价于0..y
// x.. 等价于x到数据结束
// ..  等价于0到数据结束

非字符串切片

let arr = [1,2,3,4,5];
let part = &arr[0..2];
for i in part.iter() {
  println!("{}", i);
}

更新于 2026/6/11