2014-10-28 2 views
21

나는 녹이에서 r#"" 연산자를 보았지만 그것이 무엇을하는지 찾을 수 없습니다.운영자 r # ""in Rust

let var1 = "test1"; 
let json = r#"{"type": "type1", "type2": var1}"#; 
println!("{}", json) // => {"type2": "type1", "type2": var1} 

무엇 운영자 r#""의 이름이고 내가 var1 평가 어떻게해야합니까 : 그것은 생성 JSON을 위해 유용했다?

답변

22

나는 그것이 문자열 리터럴 및 원시 문자열과 관련이있다

를 무엇을 찾을 수 없습니다. 나는이 게시 당신이 무엇을 볼 수있는 코드 블록에, this part of the documentation에서 꽤 잘 설명 생각 :

"foo"; r"foo";      // foo 
"\"foo\""; r#""foo""#;    // "foo" 

"foo #\"# bar"; 
r##"foo #"# bar"##;    // foo #"# bar 

"\x52"; "R"; r"R";     // R 
"\\x52"; r"\x52";     // \x52 

그것은 문자열 내부에 특수 문자를 이스케이프 할 필요가 부정.

29

문자열 리터럴의 시작 부분에있는 r 문자는 raw string literal을 나타냅니다. 연산자가 아니라 접두사입니다.

일반적인 문자열 리터럴에는 "\과 같이 문자열의 일부로 이스케이프해야하는 문자가 있습니다. " 문자는 이스케이프해야합니다. 그렇지 않으면 문자열을 종료하고 \은 이스케이프 문자이기 때문에 이스케이프해야합니다.

원시 문자열 리터럴의 경우 r과 오프닝 " 사이에 임의의 수의 # 기호를 넣을 수 있습니다. 원시 문자열 리터럴을 닫으려면 닫기 "을 입력하고 시작 부분에 같은 번호의 #을 입력해야합니다. # 문자가 0 이상인 경우 \ 문자를 문자열에 넣을 수 있습니다 (\ 문자는 특별한 의미가 없습니다). # 문자가 하나 이상있는 경우 문자열에 " 문자를 사용할 수 있습니다. 문자열에 # 문자 다음에 " 문자가 필요하면 같은 번호의 # 문자 과 하나의을 사용하여 문자열을 구분하십시오. 예 : r##"foo #"# bar"##foo #"# bar 문자열을 나타냅니다. 리터럴은 #으로 시작되는 반면, 리터럴은 #으로 시작하기 때문에 중간에 따옴표로 끝나지 않습니다.

질문의 마지막 부분에 답하려면 현재 범위의 변수를 평가하는 문자열 리터럴을 사용할 방법이 없습니다. PHP와 같은 일부 언어는이를 지원하지만 녹이 지원하지는 않습니다. format! 매크로를 대신 사용해보십시오. JSON의 경우 문자열이 매크로에 의해 해석되므로 원시 문자열 리터럴에서도 중괄호를 두 번 사용해야합니다.

fn main() { 
    let var1 = "test1"; 
    let json = format!(r#"{{"type": "type1", "type2": {}}}"#, var1); 
    println!("{}", json) // => {"type2": "type1", "type2": test1} 
} 

많은 JSON을 생성해야하는 경우 there are many crates that will make it easier for you. 특히 serde_json을 사용하면 규칙적인 Rust 구조체 또는 enum을 정의하고 JSON에 자동으로 직렬화 할 수 있습니다.

+0

#가 수행하는 작업은 무엇입니까? –

+3

원시 문자열 리터럴 구문의 일부인 구분 기호입니다. –