ソースコード中で文字列を定義する際に, 通常の "..." という形ではいくつかの文字はエスケープする必要があります. 一方 raw string を用いれば書いたままの文字列と解釈されます.
なお本記事は Tokens - The Rust Reference を要約したものです. むしろ原文よりわかりにくくなった気もしますが...
文字列
String
文字列リテラルは二重引用符内に書きます (例: "Hello, world!")が, 当然引用符をはじめとするいくつかの文字についてはエスケープが必要です. でなければ引用符を含む文字列リテラルが定義できません. 具体的には次のものに注意します (なおこれは char と共通です).
- ユニコード符号位置:
\u{32FF}のようにユニコード符号位置を直接指定する. - ASCII エスケープ:
\x41のような ASCII 符号,\n,\r,\t,\\,\0. - 引用符:
\'および\".
なお, \ 直後の改行およびインデントは無視されます.
assert_eq!("foobar", "foo\
bar");
Raw string
一方, raw string を用いれば エスケープが一切必要ない, 書いたままの文字列 として解釈されます. これは, 引用符の前に r + 0 個以上の # を配置し, raw string が終了したら引用符に加えて同じ個数の # を置くことによって定義されます. raw string の前後につける # の数は任意なので, 文字列中に登場する連続する # の最大数より多くします.
-
r"Hello, world!"->Hello, world! -
r#"これ"は引用符"#->これ"は引用符 -
r##"#06-6012-3456"##->#06-6012-34567
バイト列
バイト列 [u8] は char/str リテラルに接頭辞 b を設けることで宣言できます. ただし ASCII 文字しか使えません. 対応して, ユニコード符号位置を除く上述のエスケープを使用することができます. ひとつおもしろい点として, 文字列では "\x41" は ASCII 符号でしたから 0x7F が上限でしたが, いまはバイト u8 として解釈するため 0xFF まで使えます (例えば b"\xFF").
さらに, バイト列に関しても raw bytes が存在し, 例えば br##"#06-6012-3456"## は有効な [u8] リテラルの宣言です.