🦀

Rust の Raw String Literal の使い道

2024/01/15に公開

Python のように '" が可換に用いられる言語とは異なり,Rust では String Literal が " で囲まれて用いられる.

この事情で,serde_json などで文字列をパースしたい場合に非常に読みにくいリテラルを書くことになる(下記は Refactoring to Rust の第 6 章から引用):

#[derive(Debug, serde::Deserialize)]
struct Data {
  name: String,
  value: i32,
}

fn main() {
  let result = sum("{ \"name\": \"Rachelle Ferguson\", \"value\": 948129 }");

  println!("{}", result);
}

fn sum(input: &str) -> i32 {
  let parsed: Data = serde_json::from_str(input).unwrap();

  parsed.name.len() as i32 + parsed.value #1
}

こうしたケースで役に立つのが Raw String Literal であり,

- let result = sum("{ \"name\": \"Rachelle Ferguson\", \"value\": 948129 }");
+ let result = sum(r#"{ "name": "Rachelle Ferguson", "value": 948129 }"#);

といった回避方法を提供する.

通常の String Literal も Raw String Literal も使用法は

に書かれているが,端的に述べるならば

N >= 1 に対し r(N 個の #)" で開始し,"(N 個の #) にマッチするまでは終了しない

という性質が保たれていそうである.要するにそのコンテキストでは "((N - 1) 個の #) に出現しても,その直後の文字が # でなければ,やはり Raw String として続けて良いということになる.

Discussion