Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

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 عبر الإنترنت