S-JIS[2024-09-26] 変更履歴

Rust String構造体

Ruststd::string::String構造体のメモ。


概要

Rustで文字列を扱うのがString構造体。
String構造体はstd::preludeに含まれているので、useしなくても使える。

内部ではVec<u8>(バイト列)でUTF-8を保持している。末尾のnul文字は無いらしい。


let s = String::new();	// 空の文字列
let s = String::from("abc");
let s = "abc".to_string();

Stringは変更可能な文字列である。つまり別の文字列を付け加えたりすることが出来る。

    let mut s = String::from("abc");
    s.push_str("def");	// 末尾に文字列を追加する
    println!("{}", s);

ただし、Stringの中身を変更する場合は、Stringを保持している変数にmut(mutable(変更可能))を付けておく必要がある。
(mutが付いていない変数は不変という扱いになり、インスタンスの中身を変更することは出来ない)


関数(やメソッド)の引数が&strの場合、そこに&Stringを渡すことが出来る。

fn example1(s: &str) {
    println!("{}", s);
}
    let s: String = String::from("abc");
    example1(&s);

StringとOption<String>の両方を受け取る関数の例

Rustでは関数のオーバーロードを作れない(引数の型が異なる同名関数を作れない)が、ひとつの関数の引数でStringとOption<String>のどちらでも受け取れるようにすることが出来る。

(何故そんなことをしたいかと言うと、RustではStringにnullを保持できないので、普段はStringで受け取りつつ、何も無いときはNoneが渡せると便利だから)

fn example2<T: Into<Option<String>>>(s: T) {
    let s: Option<String> = s.into();
    match s {
        Some(s) => println!("{}", s),
        None => println!("None"),
    }
}
    example2(String::from("abc"));
    example2(None);

stdへ戻る / Rustへ戻る / 技術メモへ戻る
メールの送信先:ひしだま