Rust字串的種類及其應用
Rust字串有不同的型態,這篇文章會介紹常用的字串類型,以及他們的應用。
&str
是一個指向字串的指標,它是一個不可變的字串,它的值是在編譯時期就已經確定的,所以它的大小是固定的。
- UTF-8編碼
- 可以應用於slice(切片)
- 不具備ownership(所有權)
1
2
3
4
5
| let s = String::from("hello world");
let hello = &s[0..4];
// hello: hell
println!("hello: {}", hello);
|
警告
需要注意使用slice的時候要注意邊界(boundary
),否則會出現panic。
比如說定義了一個&str為叮叮你好
,想使用slice取出叮叮
,但是如果使用&hello[0..2]
,會出現panic,因為叮
的utf-8編碼是3個byte,所以要使用&hello[0..6]
才是正確的。
1
2
3
4
5
6
7
8
9
| let hello = "叮叮你好";
// panic: byte index 2 is not a char boundary; it is inside '叮' (bytes 0..3) of `叮叮你好`
// let s = &hello[0..2];
// correct
let s = &hello[0..6];
// 叮叮
println!("{}", s);
|
String
是一個可變的字串,它的值是在執行時期才會確定的,所以它的大小是不固定的。
- UTF-8編碼
- 可以改變字串的值
- 具備ownership(所有權)
以下是建立String
的幾種方式:
1
2
3
4
5
6
| // 不可變的String
let s = String::from("Hello, world!");
// 可變的String
let mut s = String::from("Hello, world!");
// 使用to_string()方法
let s = "Hello, world!".to_string();
|
使用push_str
方法來更新字串:
1
2
3
4
| let mut s = String::from("Hello, ");
s.push_str("world!");
// Hello, world!
println!("{}", s);
|
使用push
方法來更新字串: 這個方法只能接受一個字元,如果要接受多個字元,可以使用push_str
方法。
1
2
3
4
5
6
7
| let mut s = String::from("你好啊, ");
s.push('旅');
s.push('行');
s.push('者');
s.push('A');
// 你好啊, 旅行者A
println!("{}", s);
|
使用+
來串接字串:
1
2
3
| let s1 = String::from("Hello, ");
let s2 = String::from("world!");
let s3 = s1 + &s2; // 注意 s1 被移動了,不能繼續使用
|
使用format!
來串接字串:
1
2
3
4
5
6
7
| let s1 = String::from("tic");
let s2 = String::from("tac");
let s3 = String::from("toe");
let s = format!("{}-{}-{}", s1, s2, s3);
// tic-tac-toe: s1、s2、s3 還可以繼續使用
println!("{}", s);
|
使用chars
方法來迭代字串: 這個方法會返回字串的字元。
1
2
3
4
| let s = String::from("你好啊, 旅行者A");
for c in s.chars() {
println!("{}", c);
}
|
使用bytes
方法來迭代字串: 這個方法會返回字串的UTF-8編碼。
1
2
3
4
| let s = String::from("你好啊, 旅行者A");
for b in s.bytes() {
println!("{}", b);
}
|
使用len
方法來取得字串的長度: 這個方法會返回字串的字元數量。
1
2
3
| let s = String::from("你好啊, 旅行者A");
// 21,因為中文字元的UTF-8編碼是3個byte,英文、標點符號跟空白字元是1個byte
println!("{}", s.len());
|
1
2
3
4
5
| let s = String::from("你好啊, 旅行者A");
// 將字串迭代後反轉,並使用collect方法將迭代收集起來
let rev_s: String = s.chars().rev().collect();
// A者行旅 ,啊好你
println!("{}", rev_s);
|