rust复合类型
字符串
由于rust的字符串元素类型是u8
(1字节),但是字符类型是unicode(4字节)
- 索引不能像C++那样读取
- 又由于String类型和&str类型都是utf-8编码,中文占3字节
- 切片可能会导致崩溃
slice(切片)
切片就是对String
类型中的一部分的引用,它不会拥有自己的内存空间。
- 这个就是C++中的string_view
- 类型标识
&str
- 由于编码问题对于汉字切片可能导致崩溃,所以可以用
utf8_slice
库
创建slice
let s = String::from("hello");
let hello = &s[0..5]; // 从索引0开始,到索引4结束
let hello = &s[0..4]; // 从索引0开始,到索引4结束
let hello = &s[..4] // 从索引0开始,到索引4结束
let hello = &s[..]; // 从索引0开始,到字符串最后一个字符结束
let hello = &s[1..] // 从索引1开始,到字符串最后一个字符结束
&[begin, end],实际上取得索引左闭右开的区间[begin, end)
insert
使用insert
插入单个字符
insert_str
插入字符串字面量
push
push方法只能在String类型上调用,不能在&str上调用。
push()
向字符串尾部追加字符push_str()
字符串字面值。
replace
replace
替换字符串中的一个子串
返回的是一个新的字符串,不会修改原来的字符串
replace()
let mut s = String::from("hello world");
let new_s = s.replace('o', '0'); // 替换所有的o为0
replacen()
多一个参数:代表要替换的个数
let mut s = String::from("hello world");
let new_s = s.replacen('o', '0', 1); // 替换第一个o为0
replcae_range()
第一个参数代表要替换的范围,第二个参数是替换成什么。
let mut s = String::from("hello world");
let new_s = s.replace_range(0..5, "hi"); // 替换从索引0开始,到索引4结束的字符串为"hi"
delete
pop
删除并返回字符串的唯一一个字符,若字符串为空,则返回None
let mut s = String::from("hello");
let ch = s.pop(); // 删除并返回最后一个字符
remove
删除指定索引的字符,并返回被删除的字符。
let mut s = String::from("hello world");
let ch = s.remove(0); // 删除并返回第一个字符
truncate
删除从指定位置开始到结尾的全部字符,无返回值
clear
清空
concatenate
+,+=
使用 +
或者 +=
连接两个字符串。
要求右边使用是切片引用类型,(本质调用底层 add())
format!
let s1 = String::from("tic");
let s2 = String::from("tac");
let s = format!("{}{}", s1, s2); // 连接字符串
元组
- 元组类型由各个元素的类型构成,用圆括号
()
表示。 - 元组长度固定
- 顺序也固定