to_s و inspect
جزء من قسم البرمجة كائنية التوجه في رحلة Ruby على Coddy. الدرس 5 من 57.
تحوّل puts كائنًا إلى نص عن طريق استدعاء أسلوبه to_s. يعطي to_s الافتراضي اسم الصنف وعنوانًا في الذاكرة فقط، مثل #<Book:0x000055d0>، لذا تعرّف الأصناف أساليبها الخاصة. ويستدعي استيفاء السلاسل النصية to_s أيضًا:
class Book
def initialize(title, pages)
@title = title
@pages = pages
end
def to_s
"#{@title} (#{@pages} pages)"
end
end
book = Book.new("Dune", 412)
puts book
puts "Reading #{book}"الناتج:
Dune (412 pages)
Reading Dune (412 pages)تستدعي join أيضًا to_s لكل عنصر، لذا تُطبع مصفوفة من كائناتك بالتنسيق الخاص بك:
class Book
def initialize(title)
@title = title
end
def to_s
@title.upcase
end
end
shelf = [Book.new("Dune"), Book.new("Emma")]
puts shelf.join(", ")
puts "Shelf: #{shelf.join(" / ")}"الناتج:
DUNE, EMMA
Shelf: DUNE / EMMAتُستخدم p للمبرمجين: فهي تطبع inspect، التي تعرض القيمة بوضوح لا لبس فيه. تحتفظ السلسلة بعلامتي الاقتباس وتظهر nil. بالنسبة إلى الكائنات التي تنشئها بنفسك، تعرض inspect الافتراضية متغيرات النسخة:
p "Dune"
puts "Dune"
p [1, "a", nil]
puts [1, "a", nil].inspectالناتج:
"Dune"
Dune
[1, "a", nil]
[1, "a", nil]أعِد تعريف inspect للحصول على وصف موجز ودقيق لتصحيح الأخطاء. عندها تستخدمه كلٌّ من p وinspect الخاص بالمصفوفة، بينما تواصل puts استخدام to_s:
class Point
def initialize(x, y)
@x = x
@y = y
end
def to_s
"(#{@x}, #{@y})"
end
def inspect
"#<Point x=#{@x} y=#{@y}>"
end
end
pt = Point.new(1, 2)
puts pt
p pt
p [pt, Point.new(0, 5)]الناتج:
(1, 2)
#<Point x=1 y=2>
[#<Point x=1 y=2>, #<Point x=0 y=5>]التحدي
سهلأكمل الصنف Track. تخزّن initialize(title, artist, seconds) القيم. تُرجع to_s القيمة Dune by Ada (3:05)، مع عرض المدة بالدقائق والثواني المؤلفة من رقمين، وتُرجع inspect القيمة #<Track "Dune" 185s>، مع وضع العنوان بين علامتي اقتباس مزدوجتين.
يقرأ الكود المرفق المسارات على هيئة أسطر بالشكل title,artist,seconds، ويطبع كل مسار باستخدام puts ثم يطبع القائمة كاملة باستخدام p.
ضع الكود في track.rb. يحتوي main.rb على كود الإدخال/الإخراج المرفق، ولا يمكن تعديله.
جرّب بنفسك
require_relative 'track'
# كود الإدخال والإخراج المقدَّم: اتركه كما هو
input = []
while (line = gets)
input << line.chomp
end
tracks = input.map do |line|
title, artist, seconds = line.split(",")
Track.new(title, artist, seconds.to_i)
end
tracks.each { |t| puts t }
p tracks
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس البرمجة كائنية التوجه
1الفئات والكائنات
العمل مع الملفاتتعريف الفئاتمتغيرات النسخةالأساليب و selfto_s و inspectمراجعة - بطاقة المكتبة7تعدد الأشكال والكتابة بأسلوب البطة
تعدد الأشكالالكتابة بأسلوب البطةالأساليب المجردةالحالات والفئاتمراجعة - طرق الدفع3أساليب ومتغيرات الأصناف
أساليب الأصنافمتغيرات كائنات الأصنافالثوابتأساليب الإنشاءمراجعة - رموز القسائمتدرّب بنفسك: مترجم Ruby عبر الإنترنت