【05】RUST常用的集合&函数&宏&类型

文章目录

常用集合

Vec

  • 堆上连续内存
  • vector可能出现扩容,把老元素copy到内存新位置
    • 因此不允许let first = &v[0];作用域内调用v.push(4);
rust 复制代码
// 定义
let v: Vec<i32> = Vec::new();
let v = vec![1, 2, 3];	// 使用vec!宏定义

// 增加元素
v.push(4);

// 取数值
v[2]; // 下标索引
v.get(2); // 调用get

// 越界时不会panic,会返回None
v.get(100);
v[100];

// 遍历
for i in &v{
	// 不可变遍历元素
	println!("{i}");
}
for i in &mut v{
	// 可变遍历元素
	*i += 50;
}
// 融合枚举可以往vec中填充多种数据类型
enum SpreadsheetCell {
	Int(i32),
	Float(f64),
	Text(String),
}

let row = vec![
	SpreadsheetCell::Init(3),
	SpreadsheetCell::Text("x_x"),
	SpreadsheetCell::Float(3.1415926),
	];

String

String 字符串字面值 str
let s = String:::new();let s = String::from("string");let s = "string".to_string(); "string" let s1: &str = "hello";let s2 = String::from("world"); let s2_slice: &str = &s2;
堆分配的、可变的 UTF-8 字符串。本质是对 Vec 的封装,但保证内容为合法 UTF-8。 用双引号 "..." 表示的硬编码字符串。 对一段 UTF-8 字节序列的引用,通常以 &str 形式出现。

RUST中使用UTF-8编码,字符长度可变。

rust 复制代码
let mut  s = String::new();
let data = "initial contents";
let s = data.to_string(); // .to_string();用于任何实现了 Display trait 的类型
let s = "initial contents".to_string();
let mut s = String::from("foo");
s.push_str("bar");

// push_str不获取所有权,为获取一个单独的字符作为参数,并附加到 String 中。
let mut s1 = String::from("foo");
let s2 = "bar";
s1.push_str(s2);
println!("s2 is {s2}");//s2依旧有效

// + 获取了s1所有权fn add(self, s: &str) -> String {} 
let s1 = String::from("Hello, ");
let s2 = String::from("world!");
let s3 = s1 + &s2; //这里&s2发生强制类型转换为&str
// 注意 s1 被移动了,不能继续使用

//更为复杂的字符串链接,可以使用 format! 宏拼接
let s1 = String::from("tic");
let s2 = String::from("tac");
let s3 = String::from("toe");
let s = format!("{s1}-{s2}-{s3}");

// 索引字符串,不建议,UTF-8编码长度不固定,需要程序员确保正确

// 遍历字符串
// 按照字符遍历 2 字符
for c in "Зд".chars() {
	println!("{c}");
}
// 按照字节遍历 4 字节
for b in "Зд".bytes() {
	println!("{b}");
}

HashMap

默认使用SipHash进行,可以抵御涉及哈希表(hash table)的拒绝服务(Denial of Service, DoS)攻击。

rust 复制代码
use std::collections::HashMap;
let mut scores = HashMap::new();
scores.insert(String::from("Blue"), 10);
scores.insert(String::from("Yellow"), 50);

// 根据key查询数值
let team_name = String::from("Blue");
let score = scores.get(&team_name).copied().unwrap_or(0);
// get返回Option<&V>
// 调用 copied 方法来获取一个Option<i32>,没有key时会返回 None
// 调用 unwrap_or 在 scores 中没有该键所对应的项时将其设置为零


// 遍历数据
for (key, value) in &scores {
	println!("{key}: {value}");
}

// 插入后所有权归HashMap所有
use std::collections::HashMap;
let field_name = String::from("Favorite color");
let field_value = String::from("Blue");
let mut map = HashMap::new();
map.insert(field_name, field_value);
// 这里 field_name 和 field_value 不再有

// 多次插入,会新的覆盖老的。
scores.insert(String::from("Blue"), 10);
scores.insert(String::from("Blue"), 25);


//Entry 的 or_insert 方法在键对应的值存在时就返回这个值的可变引用,如果不存在则将参数作为新值插入并返回新值的可变引用。
// entry只有在没有key的时候才进行插入
let mut scores = HashMap::new();
scores.insert(String::from("Blue"), 10);
scores.entry(String::from("Yellow")).or_insert(50);
scores.entry(String::from("Blue")).or_insert(50);
// 根据key已有的value更新
let mut map = HashMap::new();
for word in text.split_whitespace() {
	let count = map.entry(word).or_insert(0);
	*count += 1;
}

打印

  • dbg!()
    • 格式打印,()获取参数所有权,并返回表达式所有权。
    • 打印到标准错误控制台流stderr
  • println!()
    • ()接受引用
    • 打印到标准输出控制台流stdout

类型

Option<T>

  • 用于空值检查 (因为编译器会保证T类似一定非空值)
相关推荐
铲子Zzz1 小时前
Java使用接口AES进行加密+微信小程序接收解密
java·开发语言·微信小程序
小小小新人121231 小时前
C语言 ATM (4)
c语言·开发语言·算法
Two_brushes.1 小时前
【linux网络】网络编程全流程详解:从套接字基础到 UDP/TCP 通信实战
linux·开发语言·网络·tcp/udp
小白学大数据1 小时前
R语言爬虫实战:如何爬取分页链接并批量保存
开发语言·爬虫·信息可视化·r语言
争不过朝夕,又念着往昔1 小时前
Go语言反射机制详解
开发语言·后端·golang
Azxcc02 小时前
C++异步编程入门
开发语言·c++
Biaobiaone2 小时前
Java中的生产消费模型解析
java·开发语言
我命由我123452 小时前
前端开发问题:SyntaxError: “undefined“ is not valid JSON
开发语言·前端·javascript·vue.js·json·ecmascript·js
特立独行的猫a2 小时前
11款常用C++在线编译与运行平台推荐与对比
java·开发语言·c++
VBA63373 小时前
VBA之Word应用第三章第十一节:Document对象的事件
开发语言