LoginSignup
17
7

More than 3 years have passed since last update.

[Rust] 文字列リテラル: エスケープあるいは raw string

Posted at

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

17
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
17
7