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