Rust學習筆記 - Strings

Rust字串的種類及其應用

Rust字串有不同的型態,這篇文章會介紹常用的字串類型,以及他們的應用。

&str 是一個指向字串的指標,它是一個不可變的字串,它的值是在編譯時期就已經確定的,所以它的大小是固定的。

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);