💬
Rustでfor文で文字列を探索する方法
Rustで文字列を1文字ずつ探索したい時に苦労したのでメモとして残します。
Rust Playground はこちら、GitHubはこちら。
fn main() {
let sentence :&str = "I love NewYork";
//let sentence :String = "I love NewYork".to_string();
for i in 0..sentence.len() as usize {
println!("{}", sentence.chars().nth(i).unwrap());
}
}
-
探索の対象とする文字列の型
&str を使う。
String を使った場合は、文字列の後ろに to_string() を付ける。
https://qiita.com/yagince/items/e7474839246ced595f7a
https://qiita.com/uasi/items/3b08a5ba81fede837531 -
for文の範囲指定の際に文字列のサイズを使用
as usize を後ろにつける -
文字列のインデックスを指定して文字を取得
sentence[i]は使えないので、sentence.chars().nth(i).unwrap() とする。
https://qiita.com/HelloRusk/items/7fb68395984958987a54
chars()は文字列を文字に分割する
println!("{:?}", "I love NewYork".chars());
=> Chars(['I', ' ', 'l', 'o', 'v', 'e', ' ', 'N', 'e', 'w', 'Y', 'o', 'r', 'k'])
nth()は n 文字目の文字を取得する
最後に .unwrap()を付ける
unwrap() は、 Option<T> 型や Result<T, E> 型の値(つまり、何かしらの値を ラップ している値)から中身の値を取り出す関数
https://ja.stackoverflow.com/questions/1730/rustのunwrapは何をするものですか
Discussion
こんにちは。
chars()
の結果はイテレータを実装しているのでそのままfor
式で繰り返せます。そのまま繰り返せるものをわざわざインデックスで取り出すのは回りくどいですし、
.chars().nth(i)
は文字列の先頭から走査して遅いのでほぼ全ての場合でchars
をそのまま繰り返す方が推奨されています。(参考: https://rust-lang.github.io/rust-clippy/master/#needless_range_loop )もしインデックスも同時に必要な処理をしているなら
.enumerate()
が使えます。記事中の参考リンクでも紹介されているやり方ですね。
参考になれば。
おお、ご指摘ありがとうございます!
ご指摘を踏まえ追記しました!