Rustのstd::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);
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);