通用集合 vector、字符串、 哈希 map
vector(可以理解为list)
- 初始化
let v: Vec<i32> = Vec::new();
使用初始值来创建 vec! 宏:let v = vec![1, 2, 3];
- 使用 vector
//新增值 v.push(5); //读取值 let v = vec![1, 2, 3, 4, 5]; let third: &i32 = &v[2]; // 访问不存在的元素时 Rust 会造成 panic! let third: Option<&i32> = v.get(2); // Some(&element) 或 None 的逻辑 //遍历读 let v = vec![100, 32, 57]; for i in &v { println!("{}", i); } //遍历写 let mut v = vec![100, 32, 57]; for i in &mut v { *i += 50; }
- vector 只能存储一种类型,如果需要多种类型,使用枚举
enum SpreadsheetCell { Int(i32), Float(f64), Text(String), } let row = vec![ SpreadsheetCell::Int(3), SpreadsheetCell::Text(String::from("blue")), SpreadsheetCell::Float(10.12), ];
字符串 str String
Rust 的核心语言中只有一种字符串类型:str。字符串 slice,它通常以被借用的形式出现,&str
String 类型字符串是由标准库提供的,而没有写进核心语言部分,它是可增长的、可变的、有所有权的、UTF-8 编码的字符串类型。
-
新建字符串
let mut s = String::new(); let data = "initial contents"; let s = data.to_string(); let s = String::from("initial contents");
-
更新字符串
- 通过 push_str 方法来附加字符串 slice,从而使 String 变长:s.push_str(“bar”);
- push 方法被定义为获取一个单独的字符作为参数,并附加到 String 中:s.push(‘l’);
-
字符串使用 + 运算符
- add 函数限制,只能将 &str 和 String 相加,不能将两个 String 值相加
- 字符串作为参数传入时 &String 默认可以被强转(coerced)为 &str
-
字符串format
format! 与 println! 的工作原理相同,不过不同于将输出打印到屏幕上,它返回一个带有结果内容的 String
let s = format!("{}-{}-{}", s1, s2, s3); 替代 let s = s1 + “-” + &s2 + “-” + &s3;
-
字符串用不可以索引取值
- 字符串基于 vector 实现
- 英文占一个字节,中文占两个字节。
- 区分英文字节、中文字节(unicode)、字符(最接近人们眼中字母的概念)。最终都以以utf-8形式存储,存储形式是ascii[224, 164, 168]
-
截取部分字符串
- 索引超出会在运行时会 panic,程序崩溃
let hello = “Здравствуйте”;
let s = &hello[0…4]; // s 将会是 “Зд” - 从字符串中获取字形簇是很复杂的,所以标准库并没有提供这个功能
- 索引超出会在运行时会 panic,程序崩溃
-
遍历字符串
chars方法、bytes方法for c in "नमस्ते".chars() { println!("{}", c); }
哈希 map HashMap<K, V>储存键值对
-
hashMap 需要引入库
use std::collections::HashMap
-
新插入或更新
map.insert(String::from("Blue"), 10);
-
像 vector 一样,哈希 map 将它们的数据储存在堆上。同样类似于 vector,哈希 map 是同质的:所有的键必须是相同类型,值也必须都是相同类型。
-
两个元组也可以生成一个哈希map:
let map: HashMap<_, _> = 元组1.iter().zip(元组2.iter()).collect();
-
所有权:一旦键值对被插入后就为哈希 map 所拥有
-
获取map中的值map.get(),返回Option
-
遍历
for (key, value) in &scores { println!("{}: {}", key, value); }
-
只在键不存在时插入
- entry 函数的返回值是一个枚举,Entry,它代表了可能存在也可能不存在的值。
- 不存在就插入:
map.entry(String::from("Yellow")).or_insert(50);
并返回修改过的 Entry 的建的值得一个可变引用(&mut V),如果需要赋值,需要解引用,用星号(*)解引用