web-dev-qa-db-ja.com

文字列から単一の文字を取得する

_std::str_ の最初の文字を取得したい。メソッド char_at() は現在不安定です- _slice_chars_ in _std::string::String_ .

私が現在思いついた唯一のオプションは次のとおりです。

_let text = "hello world!";
let char_vec:Vec<char> = text.chars().collect();
let ch = char_vec[0];
_

しかし、これは単一の文字を取得するだけで、残りのベクトルを使用しないために過度に思えます。

34
XAMPP Rocky

UTF-8は「文字」が何であるかを定義しないので、あなたが望むものに依存します。この場合、charsはUnicodeスカラー値であるため、&strの最初のcharは1〜4バイトになります。

最初のcharのみが必要な場合は、Vec<char>に収集せず、イテレーターを使用します。

let text = "hello world!";
let ch = text.chars().next().unwrap();
56
Steve Klabnik

&strの先頭と残りを返す関数を作成しました。

fn car_cdr(s: &str) -> (&str, &str) {
    for i in 1..5 {
        let r = s.get(0..i);
        match r {
            Some(x) => return (x, &s[i..]),
            None => (),
        }
    }

    (&s[0..0], s)
}

次のように使用します。

let (first_char, remainder) = car_cdr("test");
println!("first char: {}\nremainder: {}", first_char, remainder);

出力は次のようになります。

first char: t
remainder: est

1バイト以上の文字で正常に動作します。

1
Sean