する必要がありますので、私はでルーストに文字列に関するこれらの誤解を明確にしようとすることを前提としています本からの引用(https://doc.rust-lang.org/book/strings.html)。それらは、&str
又はString
される文字の配列でないかどうか
A ‘string’ is a sequence of Unicode scalar values encoded as a stream of UTF-8 bytes. All strings are guaranteed to be a valid encoding of UTF-8 sequences.
これを考慮して
、プラスそのUTF-8コード・ポイントは、可変(文字に依存して1〜4バイト)のサイズである、さび内のすべての文字列、 、そのように扱うことはできません。理論的には、これは私たちが一定時間内のn番目のバイトを取得することを可能にするだろうが、そのバイトは保証されませんので、ご質問で述べたものとは異なり
Because strings are valid UTF-8, they do not support indexing:
let s = "hello";
println!("The first letter of s is {}", s[0]); // ERROR!!!
Usually, access to a vector with [] is very fast. But, because each character in a UTF-8 encoded string can be multiple bytes, you have to walk over the string to find the nᵗʰ letter of a string. This is a significantly more expensive operation, and we don’t want to be misleading.
を、1はs[n]
を行うことはできません:それは、さらに、なぜスライスに説明しますそれ自身で何らかの意味をなす。
v [i..j]のコストはいくらですか?
それはバイトレベルで行われるので、スライスのコストは、実際には一定である:
You can get a slice of a string with slicing syntax:
let dog = "hachiko";
let hachi = &dog[0..5];
But note that these are byte offsets, not character offsets. So this will fail at runtime:
let dog = "忠犬ハチ公";
let hachi = &dog[0..2];
with this error:
thread '' panicked at 'index 0 and/or 2 in 忠犬ハチ公
do not lie on character boundary'
は基本的には、スライスが許容され、その文字列の新しいビューが得られますので、何のコピーは行われません。ただし、オフセットが文字境界の点で正しいことが完全にわかっている場合にのみ使用してください。
文字列の各文字を反復するためには、あなたの代わりにchars()
を呼び出すことができます:
let c = s.chars().nth(n);
でもこのことを念頭に置いて、あなたがしたい場合はUnicode文字を処理することは正確に何をしたいではないかもしれないことに注意してくださいキャラクタモディファイアをUTF-8で扱います(スカラー値は単独で扱うべきではありません)。 str
API今から引用:あなたがされていない(コードポイントの配列として文字列を扱いたいならば
extern crate unicode_segmentation;
use unicode_segmentation::UnicodeSegmentation;
let s = "a̐éö̲\r\n";
let g = UnicodeSegmentation::graphemes(s, true).collect::<Vec<&str>>();
let b: &[_] = &["a̐", "é", "ö̲", "\r\n"];
assert_eq!(g, b);
を錆が人より優れたプログラマーを作る方法をちょうど別の例。私はちょうどdownvotesを理解していない。正当な疑問とよくある誤解です。 –
この質問は、「Rust []演算子は文字列でどうやって動作するのですか」から「Rust文字列がどのようにスライスされ、文字がどのようにインデックス付けされるのか」という言い回しを少し変更しても問題ありません。また、与えられたリンクと矛盾し、ダウンボントを容易に引きつけるいくつかのステートメントがあります。 –
@ dpc.pw多分、ここで多くの質問がありますので、OPが少し難しく検索したり、質問をする前に取り入れる努力の量を見せている場合は、これについて説明しています。 – Shepmaster