Rust の文字列操作(1)
さて,所有権について何とな〜く分かったところで,目先を変えて文字・文字列・文字列操作について調べていこう。
Rust の「文字列」は Unicode/UTF-8 限定
文字列操作で何が面倒かって複数の文字セットと文字エンコーディングが混在している点である。 そこで今どきのプログラミング言語は「文字列」としての操作対象を Unicode/UTF-8 に限定していることが多い。 Rust もそうした言語のひとつである。
こんにちは,世界!
まずは,以下のコードを書いてみる。
fn main() {
println!("こんにちは,世界!");
}
ここで "こんにちは,世界!"
はリテラル文字列で,実行すると
$ cargo run
こんにちは,世界!
と表示される。
println!
マクロ引数のリテラル文字列も出力される文字列も UTF-8 エンコーディングである。
ここでリテラル文字列の "こんにちは,世界!"
を強引に Shift-JIS に書き換えて実行するとどうなるか。
$ pushd src/
$ cp main.rs main.rs.utf8.txt
$ gonkf conv -s utf8 -d sjis main.rs.utf8.txt > main.rs
$ popd
$ cargo run
error: couldn't read src/main.rs: stream did not contain valid UTF-8
というわけでコンパイルに失敗しました(笑)
Rust における文字と文字列
Rust では Unicode/UTF-8 文字および文字列を扱うために以下の3つの型が存在する。
型名 | 内部表現 | 内容 |
---|---|---|
char |
u32 |
文字(Unicode 符号点) |
String |
Vec<u8> |
可変長文字列(UTF-8) |
str |
[u8] |
文字列への参照(UTF-8) |
char
および str
は組み込み型, String
は標準ライブラリで定義される型である。
str
型は文字列に対するスライスで,それ自体は所有権を持たず(値を持たないため)範囲指定付きビューとして機能する。
通常は &str
と参照の形で使う。
String
と str
の関係はこんな感じ。
fn main() {
let s: String = "Hello World".to_string();
let hw: &str = s.as_str();
let w: &str = &s[6..11];
println!("{}", s); //Output: Hello World
println!("{}", hw); //Output: Hello World
println!("{}", w); //Output: World
}
図にするとこんな感じだろうか。