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