Lv777

Lv777

github
twitter
jike
playstation
xiaoyuzhou

集合

Vector#

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


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.

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 存在堆上是可变内容.
两者可以互相转换:

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

修改#

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 的类型都固定。使用时要注意避免所有权问题,一般使用引用或克隆.

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 中的结构体和枚举类型的比较默认是基于其成员的值进行的,而不是其地址。但是,如果结构体或枚举类型的成员类型不支持比较,则需要手动实现 PartialEqEq trait 来支持比较操作。

加载中...
此文章数据所有权由区块链加密技术和智能合约保障仅归创作者所有。