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

القارئات والكاتبات

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

كتابة طريقة قارئ لكل متغير مثيل أمر متكرر. يؤدي attr_reader :title في جسم الفئة إلى إنشاء الطريقة title، التي تُرجع @title. يمكن لسطر واحد أن يسرد عدة أسماء:

class Book
  attr_reader :title, :pages

  def initialize(title, pages)
    @title = title
    @pages = pages
  end
end

book = Book.new("Dune", 412)
puts book.title
puts book.pages

الناتج:

Dune
412

attr_writer :title يُنشئ مُعيِّنًا، وهو الأسلوب title= الذي يخزّن وسيطَه في @title. يتيح لك Ruby استدعاءه باستخدام صيغة الإسناد، book.title = "Emma":

class Book
  attr_reader :title
  attr_writer :title

  def initialize(title)
    @title = title
  end
end

book = Book.new("Dune")
book.title = "Dune Messiah"
puts book.title

الناتج:

Dune Messiah

attr_accessor ينشئ كلًا من أداة القراءة وأداة التعيين. ومع وجودهما معًا، تعمل أيضًا الصياغة المختصرة مثل +=، لأن player.score += 5 تعني player.score = player.score + 5:

class Player
  attr_accessor :name, :score

  def initialize(name)
    @name = name
    @score = 0
  end
end

ada = Player.new("Ada")
ada.score += 5
ada.score += 3
ada.name = "Ada L."
puts "#{ada.name}: #{ada.score}"

الناتج:

Ada L.: 8

اكشف أقل قدر ممكن. استخدم attr_reader للقيم التي قد يقرأها الكود الخارجي ولكن لا يغيّرها، وأضف كاتبًا فقط عندما يكون تغيير القيمة من الخارج جزءًا من التصميم. يؤدي الإسناد إلى سمة للقراءة فقط إلى رفع NoMethodError:

class Book
  attr_reader :title

  def initialize(title)
    @title = title
  end
end

book = Book.new("Dune")
begin
  book.title = "Emma"
rescue NoMethodError => e
  puts e.message
end
puts book.title

الناتج:

undefined method `title=' for an instance of Book
Dune
challenge icon

التحدي

سهل

أكمل الصنف Book. يمكن للكود الخارجي قراءة title وauthor وpages، كما يمكنه قراءة pages_read وتغييره، وتبدأ قيمته عند 0. تُرجع progress القيمة Dune: 120/412 (29%)، مع تقريب النسبة إلى الأسفل.

ينشئ الكود المزوَّد كتابًا من أسطر الإدخال الثلاثة الأولى (العنوان، والمؤلف، والصفحات). كل سطر تالٍ هو عدد الصفحات التي قرأها القارئ؛ ويضيف الكود كل قيمة باستخدام book.pages_read += n. وأخيرًا يطبع Dune by Frank Herbert والتقدّم.

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

جرّب بنفسك

require_relative 'book'

# كود الإدخال/الإخراج المُزوَّد: أبقِه كما هو
input = []
while (line = gets)
  input << line.chomp
end
book = Book.new(input[0], input[1], input[2].to_i)
input.drop(3).each { |n| book.pages_read += n.to_i }
puts "#{book.title} by #{book.author}"
puts book.progress
quiz iconاختبر نفسك

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

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

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