ソースコード中で文字列を定義する際に, 通常の "..."
という形ではいくつかの文字はエスケープする必要があります. 一方 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]
リテラルの宣言です.