Menu
CoddyTech

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

جزء من قسم البرمجة كائنية التوجه في رحلة 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 عبر الإنترنت