Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

متغيرات النسخة

جزء من قسم البرمجة كائنية التوجه في رحلة Ruby على Coddy. الدرس 3 من 57.

يبدأ متغير المثيل بالرمز @ وينتمي إلى كائن واحد. وتظل القيمة المخزنة في initialize متاحة لكل طريقة من طرق ذلك الكائن، ولكل مثيل نسخته الخاصة:

class Dog
  def initialize(name)
    @name = name
  end

  def speak
    "#{@name} says Woof"
  end
end

rex = Dog.new("Rex")
bella = Dog.new("Bella")
puts rex.speak
puts bella.speak

الناتج:

Rex says Woof
Bella says Woof

يمكن للطرائق تغيير متغيرات الحالة، لذا يتذكر الكائن ما حدث له. وتشكل متغيرات الحالة الخاصة به معًا حالة الكائن:

class Counter
  def initialize
    @count = 0
  end

  def increment
    @count += 1
  end

  def report
    "count is #{@count}"
  end
end

clicks = Counter.new
clicks.increment
clicks.increment
puts clicks.report

الناتج:

count is 2

لا يمكن الوصول إلى متغيرات النسخة من خارج الكائن. لا يمكن للكود الخارجي استدعاء الأساليب إلا، لذلك يعرّف الصنف الذي يريد مشاركة قيمة أسلوبًا يعيدها، وهو قارئ:

class Dog
  def initialize(name)
    @name = name
  end

  def name
    @name
  end
end

rex = Dog.new("Rex")
puts rex.name
begin
  rex.age
rescue NoMethodError => e
  puts e.message
end

الناتج:

Rex
undefined method `age' for an instance of Dog

المتغيّر العضوي الذي لم يتم إسناد قيمة إليه مطلقًا يكون nil ولا يثير أي خطأ، ولذلك يقرأ الاسم المكتوب خطأً بهدوء متغيّرًا مختلفًا وفارغًا. تسرد instance_variables المتغيّرات التي يمتلكها الكائن فعلًا:

class Lamp
  def initialize
    @on = false
  end

  def status
    @onn.inspect
  end
end

lamp = Lamp.new
puts lamp.status
p lamp.instance_variables

الناتج:

nil
[:@on]
challenge icon

التحدي

سهل

أكمل الصنف Pet. يخزّن initialize(name, species, age) القيم الثلاث، ويضيف birthday سنة واحدة إلى العمر، ويُرجع describe جملة واحدة: حيوان أليف اسمه Rex، ونوعه dog، وعمره 3 يعطي Rex is a 3 year old dog.

ينشئ الكود المُزوَّد كائن Pet من أسطر الإدخال الثلاثة الأولى (الاسم، والنوع، والعمر)، ويستدعي birthday بعدد المرات الذي يحدده السطر الرابع، ويطبع describe.

يجب أن تضع كودك في pet.rb. يحتوي main.rb على كود الإدخال/الإخراج المُزوَّد، ولا يمكن تعديله.

جرّب بنفسك

require_relative 'pet'

# كود الإدخال/الإخراج المُزوَّد: أبقِه كما هو
input = []
while (line = gets)
  input << line.chomp
end
pet = Pet.new(input[0], input[1], input[2].to_i)
input[3].to_i.times { pet.birthday }
puts pet.describe
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس البرمجة كائنية التوجه

تدرّب بنفسك: مترجم Ruby عبر الإنترنت