Menu
CoddyTech

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>]
challenge icon

التحدي

سهل

أكمل الصنف 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
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس البرمجة كائنية التوجه

تدرّب بنفسك: مترجم Ruby عبر الإنترنت