تبدأ متغيرات المثيل بعلامة (@) ويمكن الرجوع إليها فقط ضمن طرق الفصل. أنها تختلف عن المتغيرات المحلية من حيث أنها لا وجود لها في أي وجه الخصوص نطاق. بدلاً من ذلك ، يتم تخزين جدول متغير مماثل لكل مثيل لفئة. تعيش متغيرات المثيل داخل مثيل فئة ، طالما بقيت هذه المثيل حية ، وكذلك متغيرات المثيل.
يمكن الرجوع إلى متغيرات مثيل في أي طريقة من هذه الفئة. تستخدم كل طرق الفصل نفس المثيل جدول متغير، على عكس المتغيرات المحلية حيث سيكون لكل طريقة جدول متغير مختلف. من الممكن الوصول إلى متغيرات المثيلات دون تحديدها أولاً. لن يثير هذا استثناء ، لكن قيمة المتغير ستكون لا شيء وسيتم إصدار تحذير إذا قمت بتشغيل روبي مع -W مفتاح كهربائي.
يوضح هذا المثال استخدام متغيرات المثيل. نلاحظ أن كوخ يحتوي على -W التبديل ، والتي سوف تطبع التحذيرات في حالة حدوثها. لاحظ أيضًا الاستخدام غير الصحيح خارج أسلوب في نطاق الفئة. هذا غير صحيح ومناقشتها أدناه.
لماذا هو @اختبار متغير غير صحيح؟ هذا له علاقة بالنطاق وكيف ينفذ روبي الأشياء. ضمن أسلوب ، يشير نطاق متغير المثيل إلى مثيل معين من هذه الفئة. ومع ذلك ، في نطاق الفصل (داخل الفصل ، ولكن خارج أي طرق) ، يكون النطاق هو
مثيل الطبقة نطاق. يقوم روبي بتنفيذ التسلسل الهرمي للفئة عن طريق إنشاء مثيل صف دراسي الأشياء ، لذلك هناك المثال الثاني في اللعب هنا. الأول نموذج هو مثيل لل صف دراسي الطبقة ، وهذا هو المكان @اختبار سنذهب. المثيل الثاني هو إنشاء مثيل لـ TestClassوهذا هو المكان @القيمة سنذهب. هذا مربكا بعض الشيء ، ولكن فقط تذكر أن تستخدم أبدا @متغيرات سريعة خارج الطرق. إذا كنت بحاجة إلى تخزين على مستوى الفصل ، استخدم class_variables، والتي يمكن استخدامها في أي مكان في نطاق الفصل (داخل أو خارج الطرق) وسوف تتصرف كما هي.لا يمكنك عادة الوصول إلى متغيرات مثيل من خارج كائن. على سبيل المثال ، في المثال أعلاه ، لا يمكنك الاتصال ببساطة قيمة أو قيمة t للوصول إلى متغير المثال @القيمة. هذا من شأنه كسر قواعد التغليف. ينطبق هذا أيضًا على مثيلات الفئات الفرعية ، ولا يمكنهم الوصول إلى متغيرات المثيلات التي تنتمي إلى الفئة الأصل على الرغم من أنها من الناحية الفنية من نفس النوع. لذلك ، من أجل توفير الوصول إلى متغيرات المثيل ، ملحق يجب التصريح عن الطرق.
يوضح المثال التالي كيف يمكن كتابة طرق الوصول. ومع ذلك ، لاحظ ذلك روبي يوفر اختصارًا وهذا المثال موجود فقط لتوضيح كيفية عمل طرق الوصول. من غير الشائع عمومًا رؤية طرق الوصول مكتوبة بهذه الطريقة ما لم تكن هناك حاجة إلى نوع من المنطق الإضافي للرابط.
تجعل الاختصارات الأشياء أسهل قليلاً وأكثر إحكاما. هناك ثلاثة من هذه الأساليب المساعد. يجب أن يتم تشغيلها في نطاق الفصل (داخل الفصل ولكن خارج أي طرق) ، وسوف تحدد ديناميكيا الطرق مثل الطرق المحددة في المثال أعلاه. لا يوجد سحر يحدث هنا ، ويبدو أنها كلمات رئيسية للغة ، لكنها في الحقيقة تحدد الأساليب بشكل حيوي. أيضا ، هذه الملحقات تذهب عادة في الجزء العلوي من الفصل. يوفر ذلك للقارئ نظرة عامة فورية على متغيرات الأعضاء التي ستتوفر خارج الفصل أو للفصول الفرعية.
هناك ثلاثة من طرق الوصول هذه. يأخذ كل منهم قائمة بالرموز التي تصف متغيرات المثيل التي يمكن الوصول إليها.
- attr_reader - تحديد أساليب "القارئ" ، مثل اسم الطريقة في المثال أعلاه.
- attr_writer - تحديد أساليب "الكاتب" مثل العمر = الطريقة في المثال أعلاه.
- attr_accessor - تحديد طرق "القارئ" و "الكاتب".
عند استخدام متغيرات مثيل
الآن بعد أن عرفت ما هي متغيرات المثيل ، متى تستخدمها؟ يجب استخدام متغيرات المثيل عندما تمثل حالة الكائن. اسم الطالب وعمره ودرجاته وما إلى ذلك. لا ينبغي أن تستخدم للتخزين المؤقت ، وهذا ما هي المتغيرات المحلية ل. ومع ذلك ، يمكن استخدامها للتخزين المؤقت بين استدعاءات الطريقة لإجراء العمليات الحسابية متعددة المراحل. ومع ذلك ، إذا كنت تفعل هذا ، فقد تحتاج إلى إعادة التفكير في تكوين الطريقة الخاصة بك وجعل هذه المتغيرات في معلمات الطريقة بدلاً من ذلك.