يمكن للكائنات أن تحتفظ بحالتها الخاصة عبر تعيين متغيرات الكائن. تعيش هذه المتغيرات داخل الكائن، وتُستخدم عادةً لتخزين بعض الحالة الداخلية.
تبدأ متغيرات الكائن دائمًا بعلامة @.
يمكنك إنشاء متغير كائن جديد بتعيين متغير يبدأ بـ @.
على سبيل المثال:
class Repeater
def hear(something)
# Save what's been heard into a new instance variable called @heard
@heard = something
end
def repeat
# Return the value of the instance variable
@heard
end
end
repeater = Repeater.new
repeater.hear("Hello, friend!")
print repeater.repeat # Prints "Hello, friend!"
عادةً ما تُعيّن الكائنات حالتها الأولية في طريقة initialize، وهي طريقة تُستدعى تلقائيًا عند استدعاء new على صنف.
class Airplane
def initialize
@wings = 2
end
def wings
@wings
end
end
plane = Airplane.new
plane.wings # returns 2
يمكن لطريقة initialize أيضًا أن تأخذ وسائط، بحيث يبدأ كل كائن بحالة مخصصة:
class Suitcase
def initialize(locked)
@locked = locked
end
end
من الممارسات الجيدة أن تعتبر متغيرات الكائن خاصة، بحيث لا تُقرأ ولا تُكتب من الخارج. وبدلًا من ذلك، نعرّف طرقًا للحصول على قيمها وتعيينها. على سبيل المثال:
class Suitcase
def initialize
@locked = false
end
def locked? # Query methods should be named with a trailing `?`
@locked
end
def lock! # Methods which mutate state should have trailing `!`
@locked = true
end
end
suitcase = Suitcase.new
suitcase.locked? # false
suitcase.lock!
suitcase.locked? # true
Nil كلمة إنجليزية تعني «لا شيء» أو «صفر».
في Ruby، يُستخدم nil للتعبير عن غياب الكائن.
وفي لغات برمجة أخرى، قد تؤدي قيم مثل null أو none دورًا مشابهًا.
# I do not have a favorite color
favorite_color = nil
يمنح Ruby أي متغير كائن القيمة الافتراضية nil عند أول ظهور له، إلى أن تُسند إليه قيمة أخرى.
print @favourite_color # prints nil
@favourite_color = "blue"
print @favourite_color # prints "blue"
بصفتك تعمل في مدينة ملاهٍ، أُعطيت مواصفات لتصميم نظام لإدارة الحضور والألعاب. طُلب منك تصميم نموذج للـ Attendee (الشخص الذي يزور المدينة).
Attendee جديدةنفّذ الطريقة Attendee#initialize في الصنف Attendee، ويجب أن تأخذ الطول (بالسنتيمتر) وتخزّنه في متغير نسخة.
Attendee.new(106)
# => #<Attendee:0x000055c33e6c7e18 @height=106>
نفّذ الدالة الجالبة Attendee#height في الصنف Attendee، ويجب أن تُرجع طول النسخة.
Attendee.new(106).height
# => 106
لم يشترِ جميع الحاضرين تذكرة ألعاب، لكننا نحتاج إلى معرفة ما إذا كانت لديهم تذكرة أم لا. نفّذ الدالة الجالبة Attendee#pass_id في الصنف Attendee، ويجب أن تُرجع قيمة pass_id الخاصة بالنسخة، أو nil إذا لم تكن لدى الحاضر تذكرة.
Attendee.new(106).pass_id
# => nil
نفّذ Attendee#issue_pass! لتغيير حالة النسخة، واضبط متغير نسخة معرّف التذكرة على الوسيط. ويجب أن تُرجع معرّف التذكرة.
attendee = Attendee.new(106)
attendee.issue_pass!(42)
attendee.pass_id
# => 42
يخالف بعض الزوار القواعد بسلوك غير آمن، لذا تريد المدينة أن تكون قادرة على إبطال التذاكر. نفّذ Attendee#revoke_pass! لتغيير حالة النسخة، واضبط معرّف التذكرة على nil.
attendee = Attendee.new(106)
attendee.issue_pass!(42)
attendee.revoke_pass!
attendee.pass_id
# => nil
سجّل في Exercism لتتعلّم وتتقن Ruby عبر 21 مفهومًا121 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.