Vector
- 动态数组类型用Vec<T>
几种创建方式
let v: Vec<i32> = Vec::new();
let mut v = Vec::new();
v.push(1);
let v = vec![1, 2, 3];
Vec::with_capacity(capacity)
- 访问元素,确保索引不会越界的时候,就用索引访问,否则用 .get(索引超出返回None)
- 数组的大小是可变的,当旧数组的大小不够用时,Rust 会重新分配一块更大的内存空间,然后把旧数组拷贝过来。这种情况下,之前的引用显然会指向一块无效的内存, 所以不允许不可变借用和可变借用一起使用
- 遍历
let v = vec![1, 2, 3];
for i in &v {
println!("{}", i);
}
let mut v = vec![1, 2, 3];
for i in &mut v {
*i += 10
}
HashMap
- 需要use std::collections::HashMap;
- 创建&插入&查询
use std::collections::HashMap;
// 创建一个HashMap,用于存储宝石种类和对应的数量
let mut my_gems = HashMap::new();
// 将宝石类型和对应的数量写入表中
my_gems.insert("红宝石", 1);
my_gems.insert("蓝宝石", 2);
my_gems.insert("河边捡的误以为是宝石的破石头", 18);
use std::collections::HashMap;
let mut scores = HashMap::new();
scores.insert(String::from("Blue"), 10);
scores.insert(String::from("Yellow"), 50);
let team_name = String::from("Blue");
let score: Option<&i32> = scores.get(&team_name);
use std::collections::HashMap;
let text = "hello world wonderful world";
let mut map = HashMap::new();
// 根据空格来切分字符串(英文单词都是通过空格切分)
//or_insert 返回了 &mut v 引用,因此可以通过该可变引用直接修改 map 中对应的值
//使用 count 引用时,需要先进行解引用 *count,否则会出现类型不匹配
for word in text.split_whitespace() {
let count = map.entry(word).or_insert(0);
*count += 1;
}
println!("{:?}", map);
- 跟 Vec 一样,如果预先知道要存储的 KV 对个数,可以使用 HashMap::with_capacity(capacity) 创建指定大小的 HashMap,避免频繁的内存分配和拷贝,提升性能
错误处理
- 可恢复错误,Result<T, E> 用于可恢复错误
- 不可恢复错误,panic! 用于不可恢复错误
当出现 panic! 时,程序提供了两种方式来处理终止流程:栈展开和直接终止
默认的方式就是 栈展开,这意味着 Rust 会回溯栈上数据和函数调用
尽量不要在 main 线程中做太多任务,将这些任务交由子线程去做,就算子线程 panic 也不会导致整个程序的结束
模块
- 所有的类型都是私有化的,包括函数、方法、结构体、枚举、常量
- 父模块完全无法访问子模块中的私有项,但是子模块却可以访问父模块、父父..模块的私有项
- pub 对外可见
- use 来引入模块,类似go的import,当外部的模块项 A 被引入到当前模块中时,它的可见性自动被设置为私有的
-
as
别名引用 - pub use 表示将该引入的内容再度设置为可见
- 多个引入,use std::collections::{HashMap,BTreeMap,HashSet};
- 引入所有,use std::collections::*
网友评论