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סיכום — כרטיס ספרייה3מתודות ומשתנים של מחלקה
מתודות של מחלקהמשתני מופע של מחלקהקבועיםמתודות ליצירת מופעיםסיכום – קודי קופוןתרגלו בעצמכם: קומפיילר Ruby אונליין