2014-10-28 27 views
21

मैंने ऑपरेटर r#"" जंग में देखा लेकिन मुझे यह नहीं पता कि यह क्या करता है।ऑपरेटर आर # "# # जंग में

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 और उद्घाटन " के बीच # प्रतीकों की मनमानी संख्या डाल सकते हैं। कच्चे स्ट्रिंग अक्षर को बंद करने के लिए, आपके पास " बंद होना चाहिए, इसके बाद शुरुआत में # वर्णों की संख्या समान होनी चाहिए। शून्य या अधिक # वर्णों के साथ, आप स्ट्रिंग मेंवर्ण डाल सकते हैं (\ वर्णों का कोई विशेष अर्थ नहीं है)। एक या अधिक # वर्णों के साथ, आप स्ट्रिंग में अक्षर " वर्ण डाल सकते हैं। यदि आपको स्ट्रिंग में # वर्णों के अनुक्रम की आवश्यकता है तो स्ट्रिंग में " के बाद, केवल # वर्ण प्लस एक स्ट्रिंग को डिलीमिट करने के लिए उसी संख्या का उपयोग करें। उदाहरण के लिए: 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 के साथ, आप नियमित जंग संरचनाओं या enums को परिभाषित कर सकते हैं और उन्हें स्वचालित रूप से JSON पर क्रमबद्ध कर सकते हैं।

+0

# क्या करता है? –

+3

यह सिर्फ एक डिलीमीटर है जो कच्चे स्ट्रिंग अक्षर के लिए वाक्यविन्यास का हिस्सा है। –