علامة التعجب هذه تدل على أن الأمر المستدعى هنا هو ماكرو وليس دالة …
في لغة سي يتم استدعاء الدالة وكذلك الماكرو بنفس الطريقة مما يخلق لبساً على من يقرأ الكود لاحقاً … لذلك في لغة 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 لغة مصغرة لكتابة الماكرو وهي بسيطة جداً تجد شرحها في كتاب اللغة.
أحد الأمور التي يجب معرفتها عند استعمال ماكرو هو الماكرو يتم معالجته وتحويلة إلى كود قبل ترجمة البرنامج إلى صيغة تنفيذية…