スライス型(Rust)
スライス型の話がおもしろい。
Q. 文字列を受け取って、その文字列中の最初の単語を返す関数を書いてください。
1 | fn first_word(s: &str) -> &str { |
?. なぜこの設計が優れているか.
- メモリ効率(ゼロコピー)
もし戻り値を String にした場合、最初の単語をコピーして新しいメモリ領域を確保する必要がある。しかし、&str を返せば、元の String のアドレスと長さを返すだけなので、データ量に関わらず一瞬で終わる。 - コンパイル時の安全性
これがRustの凄いところ、もし以下のようなコードを書こうとすると、Rustはコンパイルエラーを出して防いでくれる。
1 | let mut my_string = String::from("Hello Rust"); |
C++とかの言語では、元データが消えたことに気づかずに word(ダングリングポインタ)にアクセスしてクラッシュする可能性がある、けどRustは 「貸している間は元データを変えさせない」 というルールでこれを防げる。