サーチ…


前書き

他の多くの言語とは異なり、Rustには、 String (ヒープ割り当て文字列型)と&str (余分なメモリを使用しない借用文字列)の2つの主な文字列型があります。違いを知り、それぞれをいつ使うべきかは、Rustの仕組みを理解する上で不可欠です。

基本的な文字列操作

fn main() {
    // Statically allocated string slice
    let hello = "Hello world";

    // This is equivalent to the previous one
    let hello_again: &'static str = "Hello world";

    // An empty String
    let mut string = String::new();

    // An empty String with a pre-allocated initial buffer
    let mut capacity = String::with_capacity(10);

    // Add a string slice to a String
    string.push_str("foo");

    // From a string slice to a String
    // Note: Prior to Rust 1.9.0 the to_owned method was faster
    // than to_string. Nowadays, they are equivalent.      
    let bar = "foo".to_owned();
    let qux = "foo".to_string();

    // The String::from method is another way to convert a
    // string slice to an owned String.
    let baz = String::from("foo");

    // Coerce a String into &str with &
    let baz: &str = &bar;
}

注意:両方のString::newString::with_capacity方法は、空の文字列を作成します。ただし、後者は初期バッファを割り当て、初期には遅くなりますが、その後の割り当てを減らすのに役立ちます。 Stringの最終サイズがわかっている場合は、 String::with_capacityを優先する必要があります。

ストリングスライシング

fn main() {
    let english = "Hello, World!";

    println!("{}", &english[0..5]); // Prints "Hello"
    println!("{}", &english[7..]);  // Prints "World!"
}

ここで&演算子を使用する必要があることに注意してください。これは参照を受け取り、それを印刷するために必要なスライスタイプのサイズに関するコンパイラ情報を与えます。参照がなければ、2つのprintln!呼び出しはコンパイル時エラーとなります。

警告:スライスは文字オフセットではなくバイトオフセットで動作し、境界が文字境界にないときにパニックになります:

fn main() {
    let icelandic = "Halló, heimur!"; // note that “ó” is two-byte long in UTF-8

    println!("{}", &icelandic[0..6]); // Prints "Halló", “ó” lies on two bytes 5 and 6
    println!("{}", &icelandic[8..]);  // Prints "heimur!", the “h” is the 8th byte, but the 7th char
    println!("{}", &icelandic[0..5]); // Panics!
}

これは、文字列が単純な索引付けをサポートしていない理由でもあります(例えば、 icelandic[5] )。

文字列を分割する

let strings = "bananas,apples,pear".split(",");

splitはイテレータを返します。

for s in strings {
  println!("{}", s)
}

また、 Iterator::collectメソッドを使ってVecで "収集"することもできます。

let strings: Vec<&str> = "bananas,apples,pear".split(",").collect(); // ["bananas", "apples", "pear"]

借り入れから所有まで

// all variables `s` have the type `String`
let s = "hi".to_string();  // Generic way to convert into `String`. This works
                           // for all types that implement `Display`.

let s = "hi".to_owned();   // Clearly states the intend of obtaining an owned object

let s: String = "hi".into();       // Generic conversion, type annotation required
let s: String = From::from("hi");  // in both cases!

let s = String::from("hi");  // Calling the `from` impl explicitly -- the `From` 
                             // trait has to be in scope!

let s = format!("hi");       // Using the formatting functionality (this has some
                             // overhead)

format!()とは別に、上記のメソッドはすべて同じように高速です。

長い文字列リテラルを破る

通常の文字列リテラルを\文字で区切ります

let a = "foobar";
let b = "foo\
         bar";

// `a` and `b` are equal.
assert_eq!(a,b);

生の文字列リテラルを分割して文字列を区切り、それらをconcat!マクロ

let c = r"foo\bar";
let d = concat!(r"foo\", r"bar");

// `c` and `d` are equal.
assert_eq!(c, d);


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow