数组、向量、切片

数组

定一个数组是这样的:

let v = [1,2,3]; // v :[i32;3]
let mut mv = [1,2,3]; // mut mv:[i32;3]

在编程时一定要注意中括号和小括号的区别。

我们还可以在定义数组的同时,规划数组的容量(长度):

let v = [1; 20]; // v :[i32;20]

数组的类型是[T; N], 关于T泛型类型,以后会说到。N是这个数组的空间。

数组的长度我们可以使用.len()方法获得。

.iter()会遍历返回数组里每一个值。

我们还可以使用array[n]这种方式来取得n位上的值,与大多数语言一样,它是从0取值,最大值是数组的空间N-1。当[n]超过N的实际范围,你会得到一个运行期panicked,如果你没有对它进行正确处理,它会导致程序崩溃中断

let v = [1,2,3];
    println!("{}",v[5]); //error
    println!("{}", v[-1]); //error

上面的代码,编译时不会出现警告和错误,但运行时,会得到下面的错误,并导致程序退出:

thread '
' panicked at 'index out of bounds: the len is 3 but the index is 5', main.rs:7

数组只能储存一种类型的数据,下面的程序会报编译错误:

let a = [1,"string"];

向量

向量实际上就是可变容量的数组,它的定义是这样的:

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

但是,记住,Rust里没有加mut关键字的,都是不可变!

所以,我们需要这么生成可变长的向量:

let mut mv = vec![0,1,2];

mv.push(4); // mv ==  vec![0,1,2,4];

let x = mv.pop(); // x:i32 = 4, mv= vec![0,1,2];

切片 slice

slice类型,是对array数组类型的引用。创建一个切片依赖于数组,它是对数组的高效率拷贝。下面是一个例子:

let array = [1,2,3,4,5,6,7]

//从1位到第4位(不含第4位)。还记得么,Array是从0开始计算位数的。
let slice = &array[1..4] // slice: [2,3,4]

for e in slice.item() {
    println!("{}",e);
}
//print
//2
//3
//4

slice切片类型不能独立定义,必须是引用自Array,同时它继承了长度length、item等很多Array的方法。

slice切片内存储的也是&amp;[T]类型,也就是说它和Array一样,可以在内部储存数字、字符等类型。