🦀
Rust の Raw String Literal の使い道
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