Home

Rust 2.12 数组,vector和slice

11 Jan 2015 by LelouchHe

原文链接

和其他语言一样,Rust有串结构来表示一系列的事物.最基础的是数组(array),相同类型固定大小的若干元素集合.默认情况下,数据是不可变的.

let a = [1, 2, 3]; // a: [i32; 3]
let mut m = [1, 2, 3]; // mut m: [i32; 3]

初始化值完全相同的数组,有个简便写法.下面,数组a的每个元素都初始化为0:

let a = [0; 20] // a: [i32; 20]

数组的类型是[T; N].我们将泛型时会提到T类型标注.

你可以通过a.len()获取数组a的个数,a.iter()获取其迭代器.下面会按序输出数组中元素:

let a = [1, 2, 3];
println!("a has {} elements", a.len());
for e in a.iter() {
    println!("{}", e);
}

你可以通过下标操作符(subscript notation)来获取特定元素:

let names = ["Graydon", "Brian", "Niko"];
println!("The second name is: {}", names[1]);

像其他语言类似,下标从0开始,所以第一个名字是names[0],第二个是names[1].上面的例子输出”The second name is: Brian”.如果你使用不合法的下标,你会得到一个错误:数组存取是在运行时进行边界检查的.这样的错误在其他系统编程语言中是许多bug的来源.

vector是一个可变的数组,用标准库中的Vec<T>来实现的(以后会介绍T的含义).vector之于数组,就好比String之于&str.你可以用vec!宏来创建:

let v = vec![1, 2, 3]; // v: Vec<i32>

(注意,不像println!,我们这里使用了”[]”.”()”和”[]”都是可以的,只是使用的惯例而已)

你可以像使用数组一样的得到vector的长度,迭代器和下标操作.另外,可变的vector还可以增长:

let mut nums = vec![1, 2, 3]; // mut nums: Vec<i32>
nums.push(4);

println!("The length of nums is now {}", nums.len()); // 4

vector还有很多其他方法可用.

slice是数组的引用.可以用于安全高效且零复制的获取数组的一部分.比如,你想引用一个内存中文件的某一行.通常,slice不是直接创建的,而是通过一些已经存在的变量中获取的.slice有长度,可变或不可变,和数组很像:

let a = [0, 1, 2, 3, 4];
let middle = a.slice(1, 4); // [1, 2, 3]

for e in middle.iter() {
    println!("{}", e); // 1, 2, 3
}

你可以对vector, String&str来做slice(begin, end)操作,因为他们都是用数组实现的.slice的类型是&[T],后面我们会详述.

我们已经学完大部分Rust基本概念.我们已经可以开始写那个猜谜游戏了,现在只需要学习一件事:如何从键盘中读取输入.没法猜,还怎么猜谜啊!