什么是String
- Rust的核心语言中只有一个String类型,那就是String slice,
str
通常被当作是&str
的借用。 - String类型是通过标准库提供的,而不是直接编码到核心语言中,它是一个可增长的、可变的、utf-8编码的类型。
str
和String
都是utf-8编码的。如果你想使用一个非utf-8编码的String,可以使用OsString
。
创建新的String
-
String实际上是通过包装bytes类型的vector实现的。
-
使用new方法创建String:
let mut s = String::new()
-
使用to_string方法创建String:
rustlet data = "initial contents"; let s = data.to_string(); let s = "initial contents".to_string();
-
使用String::from方法创建字符串,
let s = String::from("initial contents")
. -
根据指定的容量,创建一个空字符串
let mut s = String::with_capacity(10);
。当字符串长度小于10的时候,不会触发内存重分配。 -
可以通过
len
方法查看字符串长度,通过capacity
方法查看字符串容量。 -
通过utf-8类型的vector创建字符串
let s_from_vec = String::from_utf8(vec![0xe4, 0xbd, 0xa0, 0xe5, 0xa5, 0xbd]);
。 -
如果vector可能包含不合法的utf-8编码则可以用
from_utf8_lossy
,这将使用占位符替换不合法的utf8字符:rustlet invalid_utf8 = vec![0xff, 0xff, 0xff]; let s_from_invalid_utf8 = String::from_utf8_lossy(&invalid_utf8);
更新String
Rust不允许使用下标访问字符串里面的单个字符
使用push_str和push追加字符串
rust
let mut s = String::from("foo");
s.push_str("bar");
// s is foobar
push_str
方法不会改变字符串的所有权
rust
let mut s = String::from("lo");
s.push('l');
// s is lol
使用+操作符或者 format!宏连接字符串
rust
let s1 = String::from("Hello, ");
let s2 = String::from("world!");
let s3 = s1 + &s2; // note s1 has been moved here and can no longer be used
rust
let s1 = String::from("tic");
let s2 = String::from("tac");
let s3 = String::from("toe");
let s = format!("{s1}-{s2}-{s3}");
扩大字符串容量
rust
let mut s_origin = String::with_capacity(10);
s_origin.push('1');
s_origin.reserve(10);
println!("{}", s_origin.capacity()); \\ 容量至少是10+1,一般会多分配一些
迭代字符串的方法
- 可以使用chars方法访问独立的UniCode字符。使用bytes方法访问每一个字节。
rust
for c in "Зд".chars() {
println!("{c}");
}
将String类型转为其他类型
- 转为bytes数组
rust
let s = String::from("hello");
let bytes = s.into_bytes();
- 转为字符串切片
&str
rust
let tmp_s = String::from("hello");
let s_str = tmp_s.as_str();