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