استخدام السمات برمز روبي

انظر إلى أي كود موجه للكائن وكلها تتبع تقريبا نفس النمط. إنشاء كائن ، واستدعاء بعض الأساليب على هذا الكائن والوصول إلى سمات ذلك الكائن. لا يوجد شيء آخر يمكنك القيام به مع كائن ما عدا تمريره كمعلمة إلى طريقة كائن آخر. لكن ما يهمنا هنا هو الصفات.

سمات مثل متغيرات سريعة يمكنك الوصول عبر تدوين نقطة الكائن. فمثلا، اسم الشخص ستصل إلى اسم الشخص. وبالمثل ، يمكنك غالبًا تعيين سمات مثل person.name = "أليس". هذه ميزة مشابهة لمتغيرات الأعضاء (كما هو الحال في C ++) ، ولكنها ليست متشابهة تمامًا. لا يوجد شيء خاص يحدث هنا ، يتم تنفيذ السمات في معظم اللغات باستخدام "getters" و "locers" ، أو الأساليب التي تسترد وتعيّن السمات من متغيرات الحالة.

لا يميز روبي بين أحرف السمة والمستوطنين والطرق العادية. بسبب أسلوب روبي المرن الذي يدعو إلى بناء الجملة ، لا يلزم إجراء أي تمييز. فمثلا، اسم الشخص و اسم الشخص() هي نفس الشيء ، أنت تتصل به اسم طريقة مع معلمات صفر. تبدو واحدة مثل استدعاء الأسلوب والآخر يشبه السمة ، لكنهما في الحقيقة نفس الشيء. كلاهما يدعون فقط اسم طريقة. وبالمثل ، يمكن استخدام أي اسم أسلوب ينتهي بعلامة يساوي (=) في مهمة. البيان

instagram viewer
person.name = "أليس" هو حقا نفس الشيء اسم الشخص = (أليس)، على الرغم من وجود مسافة بين اسم السمة وعلامة يساوي ، إلا أنها لا تزال تسمى فقط name = طريقة.

يمكنك بسهولة تنفيذ السمات بنفسك. من خلال تحديد طرق الضبط والمتغير ، يمكنك تنفيذ أي سمة تريدها. وإليك بعض الأمثلة كود تنفيذ اسم سمة لفئة الشخص. يقوم بتخزين الاسم في @اسم متغير المثيل ، ولكن لا يجب أن يكون الاسم هو نفسه. تذكر أنه لا يوجد شيء خاص حول هذه الأساليب.

شيء واحد ستلاحظه على الفور هو أن هذا الكثير من العمل. هناك الكثير من الكتابة فقط لقول أنك تريد سمة مسماة اسم التي تصل إلى @اسم المتغيرات الخاصة. لحسن الحظ ، يوفر Ruby بعض طرق الراحة التي ستحدد هذه الأساليب لك.

هناك ثلاث طرق في وحدة الطبقة التي يمكنك استخدامها داخل إعلانات الصف الخاصة بك. تذكر أن روبي لا يميز بين وقت التشغيل و "وقت الترجمة" ، ولا يمكن لأي رمز داخل تعريفات الفصول تحديد الأساليب فحسب ، بل طرق الاتصال أيضًا. استدعاء attr_reader و attr_writer و attr_accessor الأساليب ، بدورها ، ستحدد المستوطنين والحروف الذين كنا نحدد أنفسنا في القسم السابق.

ال attr_reader الطريقة مثل ما يبدو أنها ستفعل. يستغرق أي عدد من معلمات الرمز ، ويحدد لكل معلمة طريقة "getter" التي تُرجع متغير المثيل الذي يحمل نفس الاسم. لذا ، يمكننا استبدال اسم طريقة في المثال السابق مع attr_reader: الاسم.

وبالمثل ، فإن attr_writer يعرّف الأسلوب طريقة "setter" لكل رمز يتم تمريره إليه. لاحظ أن علامة التساوي لا يجب أن تكون جزءًا من الرمز ، فقط اسم السمة. يمكننا استبدال name = طريقة من المثال السابق مع استدعاء attr_writier: الاسم.

وكما هو متوقع ، attr_accessor يقوم بعمل كليهما attr_writer و attr_reader. إذا كنت بحاجة إلى كل من أداة ضبط وواضحة لسمة ، فمن الشائع عدم استدعاء الطريقتين بشكل منفصل ، وبدلاً من ذلك الاتصال attr_accessor. يمكن أن نستبدل على حد سواء ال اسم و name = طرق من المثال السابق مع مكالمة واحدة إلى attr_accessor: الاسم.

لماذا يجب تحديد المستوطنين يدويًا؟ لماذا لا تستخدم attr_ * الأساليب في كل مرة؟ لأنها تكسر التغليف. التغليف هو الأساس الذي ينص على أنه لا يجب أن يكون لأي كيان خارجي وصول غير مقيد إلى الحالة الداخلية الخاصة بك شاء. يجب الوصول إلى كل شيء باستخدام واجهة تمنع المستخدم من إتلاف الحالة الداخلية للكائن. باستخدام الطرق المذكورة أعلاه ، قمنا بفتح ثقب كبير في جدار التغليف الخاص بنا وسمحنا تمامًا بتعيين أي شيء لاسم ، حتى من الواضح أنه أسماء غير صالحة.

شيء واحد ستراه غالبًا هو ذلك attr_reader سيتم استخدامه لتعريف المُحضِّر بسرعة ، ولكن سيتم تحديد مُحدِّد مخصص نظرًا لأن الحالة الداخلية للكائن غالبًا ما تريد أن تكون اقرأ مباشرة من الدولة الداخلية. يتم بعد ذلك تعريف أداة الضبط يدويًا وتقوم بالتحقق للتأكد من أن القيمة التي يتم تعيينها منطقية. أو ، ربما بشكل أكثر شيوعًا ، لم يتم تحديد أي محدد على الإطلاق. وتضبط الطرق الأخرى في دالة class متغير الحالة خلف getter بطريقة أخرى.

يمكننا الآن إضافة عمر وتنفيذها بشكل صحيح اسم ينسب. ال عمر يمكن تعيين السمة في طريقة المنشئ ، اقرأ باستخدام عمر البالغة ولكن التلاعب بها فقط باستخدام عيد ميلاد الطريقة التي ستزيد العمر. ال اسم تحتوي السمة على getter عادي ، ولكن يعمل setter على التأكد من أن الاسم مكتوب بحروف كبيرة وأنه في شكل الاسم الاول الاسم الاخير.