Menu
Coddy logo textTech

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 אונליין