string ما هو العامل r#""#في Rust؟



syntax (2)

تشير الحرف r في بداية السلسلة الحرفية إلى سلسلة حرفية حرفية . إنه ليس عاملًا ، بل هو بادئة.

في سلسلة حرفية عادية ، هناك بعض الأحرف التي تحتاج إلى الهروب لجعلها جزءًا من السلسلة ، مثل " و \ . " يجب الهروب من الحرف لأنه سينهي السلسلة بخلاف ذلك ، ويجب أن يكون \ هرب لأنه هو شخصية الهروب.

في حرفية السلسلة الأولية ، يمكنك وضع رقم تعسفي للرموز # بين r والفتح " . لإغلاق الحرف الأولي للخيط ، يجب أن يكون لديك إغلاق " ، متبوعًا بنفس عدد الأحرف # الموجودة في البداية . باستخدام صفر أو أكثر من أحرف ، يمكنك وضع حرفي \ أحرف في السلسلة ( \ لا تملك الأحرف أي معنى خاص). باستخدام حرف واحد أو أكثر ، يمكنك وضع أحرف حرفية في السلسلة. إذا كنت بحاجة إلى " متبوعًا بتسلسل من الأحرف # في السلسلة ، فما عليك سوى استخدام نفس عدد الأحرف # بالإضافة إلى حرف واحد لتحديد السلسلة. على سبيل المثال: r##"foo #"# bar"## يمثل r##"foo #"# bar"## السلسلة foo #"# bar . الحرفي لا يتوقف عند الاقتباس في المنتصف ، لأنه يتبعه فقط # واحد ، في حين بدأ الحرفي بالرقم 2.

للإجابة على الجزء الأخير من سؤالك ، لا توجد طريقة للحصول على سلسلة حرفية تقوم بتقييم المتغيرات في النطاق الحالي. بعض اللغات ، مثل PHP ، تدعم ذلك ، ولكن ليس الصدأ. يجب أن تفكر في استخدام format! ماكرو بدلا من ذلك. لاحظ أنه بالنسبة إلى JSON ، ستظل بحاجة إلى مضاعفة الأقواس ، حتى في سلسلة حرفية حرفية ، لأن السلسلة يتم تفسيرها بواسطة الماكرو.

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

إذا كنت بحاجة إلى توليد الكثير من JSON ، فهناك العديد من الصناديق التي ستجعل الأمر أسهل بالنسبة لك . على وجه الخصوص ، مع serde_json ، يمكنك تحديد serde_json الصدأ أو التعدادات العادية وجعلها متسلسلة تلقائيًا إلى JSON.

رأيت المشغل r#"" في Rust ولكن لا يمكنني العثور على ما يفعله. لقد جاء مفيدًا لإنشاء JSON:

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

ما اسم المشغل r#"" ؟ كيف أجعل تقييم var1 ؟


Answer #1

لا يمكنني العثور على ما يفعله

الأمر يتعلق بالحرفية الحرفية والسلاسل الخام. أعتقد أنه تم شرحه جيدًا في هذا الجزء من الوثائق ، في مقطع التعليمات البرمجية الذي تم نشره هناك ، يمكنك رؤية ما يفعله:

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

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

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

ينفي الحاجة إلى الهروب أحرف خاصة داخل السلسلة.





rust