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 / EMMAp مخصّصة للمبرمجين: فهي تطبع 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 عبر الإنترنت