واحدة من أكثر الميزات المحبوبة في روبي هي بناء الجملة المرن للغاية. أنا شخصياً أحب روبي لكثرة الإمكانيات التي لدينا في تحديد الفئات وخصائصها، وهذا ما سأناقشه في هذا المقال.
الحلول الأساسية
لنفترض أننا نستخدم الصنف Foo الذي يحتوي على طريقة عامة واحدة وطريقة خاصة واحدة:
فئة Foo
ديف بار
:رائع
النهاية
خاص
ديف باز
:شيء_خاص
نهاية
نهاية
كل شيء رائع، فنحن نرى مثل هذا الحل في كل المشروع. الجري فو.نيو.باز سيتسبب في حدوث الخطأ NoMethodError (تم استدعاء الطريقة الخاصة 'baz' ل # ) وهذا ما قصدنا القيام به. ماذا سيحدث إذا حاولنا تغيير تنسيق الحفظ وإضافة خاص كبادئة في تعريف الفئة؟
فئة Foo
ديف بار
:رائع
النهاية
خاص ديف باز
:شيء_خاص
نهاية
النهاية
كما ترى بعد تشغيل الكودفإنه يعمل بالفعل! لماذا يمكننا إدخال رؤية الطريقة قبل القيام بها؟ لأنّه عند تعريف أي طريقة، يُعيد التعريف اسم الطريقة كرمز. هذا التعبير ليس فقط جزءًا من بناء الجملة، بل هو في الواقع طريقة مشتقة من صنف الوحدة النمطية وتعامل هذا الرمز كوسيطة. لمزيد من المعلومات، يرجى الاطلاع على الوثائق في هذا الرابط. بما أن الأمر بدأ بسهولة مع الخاص، دعنا نحاول تغيير رؤية الطريقة الخاصة.
فئة Foo
ديف بار
:رائع
النهاية
خاص ديف باز
:شيء_خاص
نهاية
عام :باز
نهاية
ماذا سيحدث بعد تشغيل الكود؟
irb(main):012:012:0> Foo.new.baz
=> :شيء_خاص
نجاح! أصبحت طريقة القواعد لدينا عامة لأننا جعلناها مرئية مرتين. بالطبع، تنطبق نفس العملية على الوحدات النمطية. عظيم، ولكن إلى أين سيقودنا هذا الأمر؟ تعطينا هذه الوظيفة الكثير لأنه يمكننا تغيير رؤية الطريقة بحرية أثناء تعريفها، أو حتى تغيير رؤية الطرق عند توريثها.
والآن، دعونا نلقي نظرة على ما يمكن أن يفعله روبي 2.7 من حيث تغيير رؤية الأسماء المستعارة والملحقات.
فئة Foo
خاص attr_accessor :متغير_رائع
نهاية
لسوء الحظ، نحصل على خطأ لأن الطريقة الخاصة تتوقع الرموز و attr_accessor. تُعيد الشيفرة لا شيء وبالتالي هذه الطريقة غير متوافقة مع الاستخدام الخاص في روبي 2.7. إذًا ما هي خياراتنا؟
يمكننا استخدام attr_accessor تحت الكلمة المفتاحية الخاصة لجعلها تعمل، أي أننا سنحصل على خطأ عندما نريد الإشارة إلى متغير_رائع_متغير_رائع_متغير_رائع الطريقة.
فئة Foo
خاص
attr_accessor :متغير_رائع
نهاية
الخيار الثاني هو تنفيذ الطريقة الخاصة على الطرق التي تم إنشاؤها بواسطة السمة_السمة؛ في هذه الحالة، علينا أيضًا أن نتذكر إدخال أداة الضبط هناك.
فئة Foo
السمة_المعالج :متغير_رائع
خاص :رهيب_متغير، :رائع_متغير=
نهاية
مشاكل في أتر_* ليست العوائق الوحيدة. يمكن أن نواجه نفس الصعوبة عندما نريد إنشاء اسم مستعار خاص.
فئة Foo
اسم مستعار خاص :شريط، :شريط_رائع
نهاية
روبي 3.0 وأعمالنا
لحسن الحظ، يقدم روبي 3.0 تغييرًا كبيرًا حيث يمكن لطرق الرؤية أن تأخذ مصفوفة كوسيطة ويمكن للطرق التي تحمل اسمًا مستعارًا وهو attr_* أن تعيد تعيين المصفوفة بأسماء الطرق التي تم تعريفها. يمكنك قراءة المزيد هنا.
والآن، دعنا نرى بعض الأمثلة في أحدث إصدار من euba ونتحقق مما إذا كانت التغييرات قد أُجريت بالفعل وكيف يمكننا استخدامها. في المثال الأول، دعنا نستخدم الخاص قبل ملحق attr:
فئة Foo
خاص attr_accessor :متغير_رائع
نهاية
لن تتسبب مثل هذه المكالمة في حدوث أخطاء في تحليل بناء الجملة، والأهم من ذلك أن متغير_رائع ورائع_متغير_رائع =تصبح الطرق خاصة. ستفعل طريقة الاسم المستعار نفس الشيء كما هو الحال الآن حيث تقوم أيضًا بإرجاع رمز كاسم للطريقة الجديدة وتجعله مرئيًا.
فئة Foo
اسم مستعار خاص :شريط، :شريط_رائع
نهاية
هناك حقيقة مثيرة للاهتمام وهي أنه يمكننا أيضًا الخوض في طرق أخرى، على سبيل المثاليمكن استدعاء وحدة الطباعة بين الخاص والعطرالقارئ؛ من المهم أن تُعيد هذه الطريقة مصفوفة بأسماء الطرق الموجودة على الجانب الأيمن من التعبير.
صنف الوحدة النمطية
def awesome_print(الأسماء)
يضع الأسماء
أسماء
النهاية
النهاية
صنف Foo
خاص طباعة_رهيبة_طباعة رهيبة قارئ:شريط_رهيبة
نهاية
الملخص
آمل أن تجد هذه المقالة مفيدة! في حالة وجود المزيد من الأخبار حول روبي 3.0. اقرأ المزيد هنا.