集合

Vector

对比 [[数据类型 #数组]], Vector 更像 JS 里的数组概念，可以进行增删元素的操作，但还是只能存相同类型的值.

Copy

let v: Vec<i32> = Vec::new();
let v = vec![1, 2, 3];

let num = v2.get(0); // Some(1)
let num = &v2[0];

//使用 for in 遍历元素
for num in &mut v {
*num += 1
}

好奇能不能通过赋值语句 move vector 的元素. AI 说能，给的示例代码却无法通过编译，自己写个报错 E0507.

Copy
let v = vec![String::from(""), String::from("")];
let str = v[0];
// | move occurs because value has type `String`, which does not implement the `Copy` trait

字符串

Rust 中的字符串一般指 slice 引用 &str, 是存在某处的 UTF-8 数据的引用. String 也是字符串，本质是有额外限制和功能的 vector. str 是固定长度，String 存在堆上是可变内容.
两者可以互相转换:

Copy
let mut s = String::from("str");
let r = s.as_str();

修改

Copy
let mut s = String::from("hello");
// 添加单个字符
s.push('_');
// 添加字符串
s.push_str("world");
// + 右侧只能是 &str, 左侧变量所有权被转移
let s = s + "_rust";
// 拼接不获取所有权
let s1 = String::from("!");
let str = format!("{s}{s1}!!")

Hash Map

概念和 ES6 里的 Map 差不多，存储键值对结构. key 和 value 的类型都固定。使用时要注意避免所有权问题，一般使用引用或克隆.

Copy
use std::collections::HashMap;

let mut hash = HashMap::new();
hash.insert(String::from("x"), 1);

let x = hash.get(&String::from("x"));
// 根据已有值判断插入默认值
let y = hash.entry(String::from("y")).or_insert(0);

才发现 Rust 默认比较 String 不是看地址而是比较内容的:

Lv777: Rust 声明两个 String 内容相同 这两个 String 是否相等

Raycast AI: 是的，如果两个 Rust 字符串的内容相同，则它们是相等的。这是因为 Rust 中的字符串是基于其内容而不是其地址进行比较的。可以使用 == 运算符来比较两个字符串是否相等。

Lv777: 还有什么类型的比较是对比内容的

Raycast AI: 除了 Rust 中的字符串比较之外，还有其他类型的比较也是基于其内容而不是其地址进行的。比如，对于 Rust 中的数组、切片、元组等类型，它们的比较也是基于其内容的。可以使用 == 运算符来比较它们是否相等。
另外，Rust 中的结构体和枚举类型的比较默认是基于其成员的值进行的，而不是其地址。但是，如果结构体或枚举类型的成员类型不支持比较，则需要手动实现 PartialEq 和 Eq trait 来支持比较操作。