علامة التعجب في Rust


(سليمان ) #1
println!();

علامة التعجب

هل من هدف منها ؟ امرها غريب

من المعروف أن المتغيرات أو الدوال يجب أن تحتوي فقط على حروف و _

وبهذا علمت أن هناك مايدعى بـ Macros في Rust
حيث أن
println!()
ليست دالة ! !
هنا شرح لكل كلامي
https://doc.rust-lang.org/book/ch19-06-macros.html

من يستطيع أن يبسط الأمر لي بالعربية فذلك أفضل


(مهند الرسيني) #2

علامة التعجب هذه تدل على أن الأمر المستدعى هنا هو ماكرو وليس دالة …

في لغة سي يتم استدعاء الدالة وكذلك الماكرو بنفس الطريقة مما يخلق لبساً على من يقرأ الكود لاحقاً … لذلك في لغة Rust اتفقو على أن يجعلو بعد كل استدعاء للماكرو علامة التعجيب ليسهل قراءة وفهم الكود… هذا أمر

الأمر الأخر هو أن طريقة استدعاء الماكرو وتمرير المعطيات له تختلف من ماكرو إلى آخر لذلك عندما تقراء كود وتجد علامة التعجيب تعرف أنك تتعامل مع ماكرو …

مثلاً الماكرو

println!()

يقبل عدة معطيات أو معطى واحد أو حتى يمكننا استدعاها دون تمرير اي معطى، بينما لا يمكننا عمل ذلك مع الدوال حيث أننا يجب أن نمرر يجميع المعطيات المطلوبة في الدالة.

أحياناً نجد أننا بحاجة لكتابة كود يقوم بكتابة كود آخر !! وهذا ما يسمى بالـ Metaprgramming

وهذا ما تتيحه لنا الماكروس في Rust ، خذ على سبيل المثال لا الحصر الماكرو

vec![]

والذي نستعمله لإنشاء قيمة لمتغير من نوع

Vec<T>

فبدلاً من كتابة الكود بهذه الطريقة:

let mut nums = Vec::new();
nums.push(1);
nums.push(9);
nums.push(22);

نكتب الكود بهذه الطريقة:

let nums = vec![1, 9, 22];

فكما ترى النتيجة واحدة لكن ياستعمال الماكرو اختزلنا عدة اسطر إلى سطر واحد، بتالي الماكرو

vec![]

سهل علينا كتابة الكود واختصر لنا الوقت وكذلك أصبح الكود أسهل للتعديل حيث أن التعديل يكون في سطر واحد وليس عدة أسطر.

توفر Rust لغة مصغرة لكتابة الماكرو وهي بسيطة جداً تجد شرحها في كتاب اللغة.

أحد الأمور التي يجب معرفتها عند استعمال ماكرو هو الماكرو يتم معالجته وتحويلة إلى كود قبل ترجمة البرنامج إلى صيغة تنفيذية…

كذلك Rust توفر نوعين من الـ Macors

فكما ترى الماكرو سهلة عملية التطوير واختصر الكثير من الأكواد الروتينية والمتكررة.

خذ مثالاً أخر لماكرو

html!{}

هذا ماكرو أخر يفر لنا طريق لكتابة وسوم HTML داخل كود Rust بسهولة
هنا مثال لطريقة الاستعمال

html! {
    h1 { "Hello, world!" }
    p.intro {
        "This is an example of the "
        a href="https://github.com/lfairy/maud" { "Maud" }
        " template language."
    }
}

يمكنك زيارة موقع المكتبة التي توفر هذا الماكرو إذا كنت مهتم :slight_smile:
https://maud.lambda.xyz/

هذه نبذة مصغرة عن الماكرو في Rust


(سليمان ) #3

رائع ، مفيد جدًا ماذكرته
:star_struck: