文字列

文字列はダブルクォートで書こんで定義します。これで定義した値の型はプリミティブな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#"<input type"text">"#;

この(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_strpushが使えます。

let mut s = String::new();

s.push_str("foo");
s.push('b');
s.push('a');
s.push('r');

assert_eq!(s, "foobar");

文字数の取得

StringlenはUTF-8でのバイト単位のサイズを返します。

"foo".len(); // 3
"あいうえお".to_string().len(); // 15

"foo"のような1バイト文字だけの場合は文字数と一致したサイズが取得できますが、"あいうえお"のような1文字あたり3バイトで表示されるものの場合は3 x 5 = 15となってしまいます。

2,3,4バイトの文字が含まれている場合でも正確な文字数を取得したい場合は、chars().count()を使います。これはstrStringどちらでも使えます。

"foo".chars().count(); // 3
"あいうえお".to_string().chars().count(); // 5

空文字列かどうかはis_emptyで調べることができます。

"".is_empty(); // true