数组、向量、切片
数组
定一个数组是这样的:
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
切片内存储的也是&[T]
类型,也就是说它和Array一样,可以在内部储存数字、字符等类型。