数组,元组和 Vec<Type>
没错,还不能讲输入!!!
因为 Rust 的输入和 Python 一样,全是字符串!!!(用过 C++ 再用 Python 的输入,我就完全无法理解它的逻辑)
然后解决方案就像 Python 一样,将字符串分割为数组再进行后面的处理。
所以先讲数组吧,顺便把元组(请注意这个和Python的那个不可变数据类型“元组”不一样!)也讲了。
数组:存储同类型数据,固定长度
定义
fn main() {
let mut a = [1, 2, 3, 4, 5]; // 创建**内容**可变(长度不可变) i32 类型数组 a ,长度 5,初始化为 [1, 2, 3, 4, 5]
let mut b = [String::from("a"), String::from("b")]; // 类型 String 长度 5 初始化为 [ "a", "b" ]
let mut c: [i64, 5] = [1, 2, 3, 4, 5]; // 类型 i64 长度 5 初始化为 [1, 2, 3, 4, 5]
let mut d = [0i64, 10]; // 类型 i64 长度 5 初始化为 [0, 0, 0, 0, 0]
// 我相信前三种大部分人都看懂了:
// 定义方法:
// let (mut) name = [value1, value2, ... , valuen];
// let (mut) 名称 = [值1, 值2, ... , 值n];
// 或者
// let (mut) name: [type; length] = [value1, value2, ... , valuen];
// let (mut) 名称: [类型; 长度] = [值1, 值2, ... , 值n];
// 第四种是这个意思:
// 0i64 是指 i64 类型 的 0,相似写法还有 2i32, 3u64, 2.3f32 等 格式都是 值直接加上类型
// 这个写法还可以用在其他地方
// let (mut) name = [initial_value_type; length];
// let (mut) 名称 = [初始值(+类型); 长度];
// 或者把 3,4 结合起来
let mut e: [i32; 5] = [0, 5];
// let (mut) 名称: [类型; 长度] = [初始值; 长度];
}
使用
fn main() {
let mut a = [0i64; 10];
a[0] = 1i64; // 数组内部元素访问(赋值)方法和 Py, C, C++ 一样
// 遍历(这里仅作演示,后面会仔细讲 for 循环,迭代器和指针(没错,Rust 是有指针的))
for i in a.iter() { // 这里使用迭代器进行遍历
print!("{} ", *i);
}
print!("\n");
for i in 0..10 { // 这里使用下标遍历
print!("{} ", a[i]);
}
print!("\n");
}
一些函数:
.iter()
迭代器(指针)
.iter_mut()
也是迭代器,但是可以通过 *迭代器
的格式修改内容
.sort()
排序
.to_vec()
转换为接下来要讲的 Vec<Type>
.get(i)
获取第 i 个数据
元组:存储不同类型数据,长度固定
fn main() {
let mut a: (i32, f64, u8) = (1, 2.2, 3); // 申请元组,类型为 (i32, f64, u8)
let mut b = (1, 2.2, 3); // 自动判断类型 (i32, f64, i32)
a.1 = 2; // 访问使用 名称.下标 的形式,和数组不同
// 我目前还没找到遍历元组的方法,元组既没有 .iter(), 也不可以 a.i
}
Vec<Type> (vector): 可变长度的数组,存储同类型数据
申请
fn main() {
let mut v: Vec<i32> = Vec::new(); // 新建空 vector 类型 i32
// 申请方法 1:
// let mut 名称: Vec<类型> = Vec::new(); // 这里一般要写 mut 可变,因为申请空 vector 后我们一般要向内部添加数据
let mut z = vec![1, 2]; // 初始化为 [1, 2] 类型 i32 (自动判断)
// 申请方法 2:
// let mut 名称 = vec![初始值 1, 初始值 2, ... , 初始值 n];
}
常用内建函数
.iter()
迭代器
.iter_mut()
可变迭代器
.sort()
排序
.push(something)
推入数据(到结尾)
.pop()
删除结尾数据并返回该数据
.get(i)
获取第 i 个数据
.len()
获取长度
使用
fn main() {
let mut a = vec![1, 2, 3];
a[0] = 10; // 赋值,访问方法和数组一样
a.push(4); // 推入 4
a.sort(); // 排序
for i in a.iter() { // 使用迭代器遍历,也可以用下标
print!("{} ", *i);
}
print!("\n");
// 输出: 2 3 4 10
a.pop(); //删除最后一个数据
for i in 0..a.len() { // 使用下标遍历
print!("{} ", *i);
}
print!("\n");
// 输出: 2 3 4
}