ما هو r#""# في Rust؟ تحليل كامل للعامل السحري

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

ما الذي يختبئ وراء r#""# الغامض في Rust؟ شرح كامل مع كود



هل سبق لك أن رأيت في كود Rust تدوينًا غريبًا مثل r#"..."# وفكرت: «ما هذا العامل السحري؟ هل هي صيغة سرية للمختارين؟» — أنت لست وحدك. آلاف المطورين طرحوا هذا السؤال على Stack Overflow، واليوم سنفهم نهائيًا ما هذا، ولماذا هو مطلوب، وكيفية استخدام السلاسل النصية الخام (raw string literals) في Rust.



في هذه المقالة، لن نقدم تعريفًا جافًا فقط. سننتقل من المشكلة إلى الحل، ونكتب كودًا حقيقيًا، ونرى كيف ينقذك r#""# من الصداع، ونتعرف على أين يُستخدم هذا التركيب أيضًا. هيا بنا!



المشكلة: عندما تكسر السلاسل النصية العادية الكود



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



let json_string = "{\\"name\\": \\"Rust\\", \\"year\\": 2015}";let regex = "\\\\d{2}-\\\\d{2}-\\\\d{4}"; // تاريخ بتنسيق DD-MM-YYYY


هل ترى هذا؟ في كل مرة تحتاج فيها إلى علامة اقتباس داخل السلسلة النصية، تضع قبلها شرطة مائلة عكسية (\\"). وإذا كنت بحاجة إلى الشرطة المائلة العكسية نفسها، تكتب \\\\. يتحول الكود بسرعة إلى «سلم» من الشرطات المائلة يصعب قراءته وتصحيحه.



ولكن هذا ليس سوى غيض من فيض. ماذا لو كنت بحاجة إلى إدراج حرف الجدولة في السلسلة النصية؟ عندها تكتب \\t. وماذا لو كنت بحاجة حرفيًا إلى النص \\t؟ عليك الهروب: \\\\t. تبدأ العيون بالألم من السطر الثاني.



الحل: السلاسل النصية الخام — r#""#



يقدم Rust مخرجًا أنيقًا — السلاسل النصية الخام. يتم تمييزها بالبادئة r وتُحاط بـ #:



// سلسلة نصية خام: كل ما بداخلها يُعتبر نصًا حرفيًاlet raw_json = r#"{"name": "Rust", "year": 2015}"#;let raw_regex = r#"\\d{2}-\\d{2}-\\d{4}"#;


هل تشعر بالفرق؟ لا هروب على الإطلاق! علامات الاقتباس بالداخل — مجرد علامات اقتباس. الشرطات المائلة العكسية — مجرد شرطات. يعامل مترجم Rust المحتوى بين r#" و "# كنص نقي، دون محاولة تفسير تسلسلات الهروب.



هذا مفيد بشكل خاص عند العمل مع:

  • التعبيرات المنتظمة — فهي مليئة بالشرطات المائلة والرموز الخاصة.
  • JSON، XML، HTML — سلاسل نصية تحتوي على الكثير من علامات الاقتباس.
  • استعلامات SQL — خاصة مع علامات الاقتباس المتداخلة.
  • مسارات الملفات في Windows — C:\\Users\\Name بدلاً من C:\\\\Users\\\\Name.
  • أي بيانات حيث يجب أن تبقى الشرطة المائلة العكسية كما هي.


كيف يعمل هذا تحت الغطاء؟



عندما يواجه Rust r#"..."#، فإنه ببساطة ينسخ كل ما بين r#" الابتدائي و "# النهائي إلى السلسلة النصية دون أي معالجة. لا يتحول إلى سطر جديد، ولا يصبح \\t جدولة. إنه مقطع نصي حرفي.



ولكن هناك فارق بسيط: ماذا لو ظهر داخل السلسلة النصية نفسها التسلسل "#؟ على سبيل المثال، تريد إدراج النص #"hello"#. إذا كتبت r#"#"hello"#"#، سيرتبك المترجم — أين ينتهي الحرفي؟



لهذا، ابتكر Rust علامات التجزئة المتعددة. يمكنك استخدام r##"..."##، r###"..."### وهكذا. يجب أن يتطابق عدد # على كلا الجانبين:



// السلسلة النصية تحتوي على "# بالداخل — نستخدم علامات تجزئة مزدوجةlet tricky = r##"سلسلة نصية تحتوي على "# بالداخل"##;println!("{}", tricky); // ستطبع: سلسلة نصية تحتوي على "# بالداخل

// وماذا لو كان بالداخل "##؟ عندها علامات تجزئة ثلاثية:let very_tricky = r###"نص يحتوي على "## بالداخل"###;

المدونات

توصيات الكتب