RCIE-ジャンクのコード屋

主に自分のためにコーディングのTIPSを蓄積しています。

Rust 文字列のアクセス chars, nth, collect, []

概要

  • 文字列のn番目にアクセスするには nth(数) を使う。
  • 長い文字列ほどアクセスに時間がかかる。
  • char の配列にするという手もある。
プログラム例
  • 文字列「あいうえおかきくけこさしすせそ」について。
  • 10番目の文字を表示する。
fn main() {
    let 文字列 = "あいうえおかきくけこさしすせそ";
    match 文字列.chars().nth(10) {
        Some(文字) => println!("{}", 文字),
        _ => ()
    }
}
解説
  • nth(10) で文字列の10番目を辿っている。
  • 10番目というと「こ」になりそうだが、実際には「さ」。
  • 0番目が先頭なので、添え字と文字の関係は以下のようになる。
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
(無し)
  • 文字によってデータの長さが違う。英数字=1、ロシア語=2、日本語=3(バイト)。
  • そのため、n文字目が何かを調べるたびに、先頭から調べていく必要がある。
  • n文字目が先頭から遠いほど、アクセスが遅くなる。
ランダムな場所にアクセスする場合
  • すべての文字を char(長さ8バイト)の配列に入れなおす。この作業は遅い。
  • 一度やってしまえば、どの文字も長さ8なので、指定の場所に一瞬でアクセスできる。
fn main() {
    let 文字列 = "あいうえおかきくけこさしすせそ";
    let 文字配列: Vec<char> = 文字列.chars().collect();
    println!("{}", 文字配列[10]);
}
先頭から順にアクセスする場合
  • わざわざすべての文字を配列に入れなおす必要はない。
  • for を使って、先頭から1文字ずつ取り出していく方法が最も効率的。
fn main() {
    let 文字列 = "あいうえおかきくけこさしすせそ";
    for 文字 in 文字列.chars() {
        println!("{}", 文字);
    }
}