الفهرسة والإلحاق
جزء من قسم البرمجة كائنية التوجه في رحلة Ruby على Coddy. الدرس 39 من 57.
يستدعي obj[key] الطريقة []، ويستدعي obj[key] = value الطريقة []=. يتيح تعريفهما للصنف استخدام صياغة الأقواس المربعة الخاصة بالمصفوفات والتجزئات، وفقًا للمعنى الذي يناسبه:
class Inventory
def initialize
@stock = Hash.new(0)
end
def [](name)
@stock[name]
end
def []=(name, qty)
@stock[name] = qty
end
end
inv = Inventory.new
inv["apple"] = 5
inv["apple"] += 2
puts inv["apple"]
puts inv["pear"]الناتج:
7
0يمكن أن تأخذ [] عدة وسائط، مثل صف وعمود، ويمكنها التحقق منهما. IndexError هو الخطأ المعتاد عند تحديد موضع غير موجود:
class Board
def initialize(size)
@size = size
@cells = Array.new(size) { Array.new(size, ".") }
end
def [](row, col)
check(row, col)
@cells[row][col]
end
def []=(row, col, mark)
check(row, col)
@cells[row][col] = mark
end
def check(row, col)
raise IndexError, "no cell #{row},#{col}" unless row.between?(0, @size - 1) && col.between?(0, @size - 1)
end
end
b = Board.new(3)
b[1, 1] = "X"
puts b[1, 1] + b[0, 0]
begin
b[3, 0]
rescue IndexError => e
puts e.message
endالناتج:
X.
no cell 3,0<< هو عامل الإلحاق. يتيح إرجاع self منه تسلسل الاستدعاءات، مثل list << a << b مع المصفوفات:
class Shelf
def initialize
@books = []
end
def <<(title)
@books << title
self
end
def to_s
@books.join(" | ")
end
end
shelf = Shelf.new
shelf << "Dune" << "Emma" << "Ulysses"
puts shelfالناتج:
Dune | Emma | Ulyssesيُرجع الإسناد عبر []= القيمة المُسنَدة، لا ما تُرجعه الطريقة، كما هو الحال مع أي مُعيّن. تمنح الأقواس و<< الصنف واجهةً بسيطة ومألوفة:
inv["apple"] = 5 # يستدعي []=("apple", 5)، وقيمة التعبير هي 5
inv["apple"] # يستدعي []("apple")
shelf << "Dune" << "Emma" # يعيد << القيمة self، لذا يمكن تسلسل الاستدعاءات
board[1, 2] = "X" # []=(1, 2, "X")التحدي
سهلأكمل الصنف Inventory. تُرجع inv[name] كمية عنصر (0 إذا كان غير معروف)، وتضبطها inv[name] = qty، بينما تضيف inv << name واحدةً من ذلك العنصر وتُرجع المخزون، بحيث يمكن تسلسل الاستدعاءات. تُرجع to_s القيمة apple: 3, pear: 1 بترتيب أبجدي للأسماء، مع استبعاد العناصر التي كميتها 0، أو تُرجع empty.
يقرأ الرمز البرمجي المُرفق الأوامر: set apple 5 وadd apple pear pear (الذي يربط << لكل اسم) وget apple وprint، ثم يطبع نتيجة get وprint.
ضع الرمز البرمجي الخاص بك في inventory.rb. يحتوي main.rb على رمز الإدخال/الإخراج المُرفق، ولا يمكن تعديله.
جرّب بنفسك
require_relative 'inventory'
# شيفرة الإدخال/الإخراج المقدَّمة: اتركها كما هي
input = []
while (line = gets)
input << line.chomp
end
inv = Inventory.new
input.each do |line|
cmd, *args = line.split
case cmd
when "set" then inv[args[0]] = args[1].to_i
when "add" then args.reduce(inv) { |target, name| target << name }
when "get" then puts inv[args[0]]
else puts inv
end
end
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس البرمجة كائنية التوجه
1الفئات والكائنات
العمل مع الملفاتتعريف الفئاتمتغيرات النسخةالأساليب و selfto_s و inspectمراجعة - بطاقة المكتبة7تعدد الأشكال والكتابة بأسلوب البطة
تعدد الأشكالالكتابة بأسلوب البطةالأساليب المجردةالحالات والفئاتمراجعة - طرق الدفع3أساليب ومتغيرات الأصناف
أساليب الأصنافمتغيرات كائنات الأصنافالثوابتأساليب الإنشاءمراجعة - رموز القسائمتدرّب بنفسك: مترجم Ruby عبر الإنترنت