文字列はダブルクォートで書こんで定義します。これで定義した値の型はプリミティブなstr
になります。これは定義時に省略できます。
let str = "foo";
// let str: &'static str = "foo";
// と同等
println!("{}", str); // "foo"
Rust の文字列はそのままで改行を含ませられます。
let str = "aiueo
kakikukeko";
もし文字列にエスケープ文字が含まれ、それをそのまま表示したい場合r" "
で囲みます。
let str = r"¯\_(ツ)_/¯";
さらにダブルクォートを含ませたい場合は、r#" "#
で囲みます。
let str = r#""#;
この(UTF-8)文字列のサイズは固定ですが、可変にしたい時用に Struct std::string::String も提供されています。この型へはstr
から変換することができます。
let string = str.to_string();
let string2 = String::from(str);
println!("{}, {}", string, string2);
文字列結合
文字列を結合するには最初をString
型にします。
let s = "foo".to_string() + "bar" + "baz";
assert_eq!(s, "foobarbaz");
既にString
の場合、後に来るものを参照で使います。
let foo = "foo".to_string();
let bar = "bar".to_string();
let baz = "baz".to_string();
let s = foo + &bar + &baz;
assert_eq!(s, "foobarbaz");
またはformat!
マクロを使って好きな位置に適当な変数を埋め込む方法もあります。
let s = format!("{1}{0}{baz}", "bar", "foo", baz = "baz");
assert_eq!(s, "foobarbaz");
元の変数を書き換えるならpush_str
やpush
が使えます。
let mut s = String::new();
s.push_str("foo");
s.push('b');
s.push('a');
s.push('r');
assert_eq!(s, "foobar");
文字数の取得
String
のlen
はUTF-8でのバイト単位のサイズを返します。
"foo".len(); // 3
"あいうえお".to_string().len(); // 15
"foo"
のような1バイト文字だけの場合は文字数と一致したサイズが取得できますが、"あいうえお"
のような1文字あたり3バイトで表示されるものの場合は3 x 5 = 15
となってしまいます。
2,3,4バイトの文字が含まれている場合でも正確な文字数を取得したい場合は、chars().count()
を使います。これはstr
とString
どちらでも使えます。
"foo".chars().count(); // 3
"あいうえお".to_string().chars().count(); // 5
空文字列かどうかはis_empty
で調べることができます。
"".is_empty(); // true