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基本概念.我们已经可以开始写那个猜谜游戏了,现在只需要学习一件事:如何从键盘中读取输入.没法猜,还怎么猜谜啊!