القارئات والكاتبات
جزء من قسم البرمجة كائنية التوجه في رحلة 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
412attr_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 Messiahattr_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التحدي
سهلأكمل الصنف 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
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس البرمجة كائنية التوجه
1الفئات والكائنات
العمل مع الملفاتتعريف الفئاتمتغيرات النسخةالأساليب و selfto_s و inspectمراجعة - بطاقة المكتبة7تعدد الأشكال والكتابة بأسلوب البطة
تعدد الأشكالالكتابة بأسلوب البطةالأساليب المجردةالحالات والفئاتمراجعة - طرق الدفع2المُوَصِّلات و self
القارئات والكاتباتمُعيِّنات مخصّصةself في الأساليبالهوية والمساواةمراجعة - قائمة جهات الاتصال3أساليب ومتغيرات الأصناف
أساليب الأصنافمتغيرات كائنات الأصنافالثوابتأساليب الإنشاءمراجعة - رموز القسائمتدرّب بنفسك: مترجم Ruby عبر الإنترنت