to_s i inspect
Część sekcji Programowanie obiektowe ścieżki Ruby w Coddy. Lekcja 5 z 57.
puts zamienia obiekt na tekst, wywołując jego metodę to_s. Domyślna metoda to_s podaje tylko nazwę klasy i adres w pamięci, na przykład #<Book:0x000055d0>, dlatego klasy definiują własną metodę. Interpolacja ciągów znaków również wywołuje 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}"Wynik:
Dune (412 pages)
Reading Dune (412 pages)join wywołuje też to_s dla każdego elementu, więc tablica twoich obiektów jest wyświetlana w twoim formacie:
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(" / ")}"Wynik:
DUNE, EMMA
Shelf: DUNE / EMMAp jest przeznaczone dla programistów: wyświetla wynik inspect, który pokazuje wartość w jednoznaczny sposób. Łańcuch znaków zachowuje cudzysłowy, a nil jest widoczne. W przypadku własnych obiektów domyślne inspect wyświetla zmienne instancji:
p "Dune"
puts "Dune"
p [1, "a", nil]
puts [1, "a", nil].inspectWynik:
"Dune"
Dune
[1, "a", nil]
[1, "a", nil]Nadpisz inspect, aby uzyskać krótki, dokładny opis przydatny podczas debugowania. p oraz inspect tablicy korzystają wtedy z tej metody, natomiast puts nadal używa 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)]Wynik:
(1, 2)
#<Point x=1 y=2>
[#<Point x=1 y=2>, #<Point x=0 y=5>]Wyzwanie
ŁatwyUzupełnij klasę Track. initialize(title, artist, seconds) przechowuje wartości. to_s zwraca Dune by Ada (3:05), z długością podaną w minutach i sekundami zapisanymi za pomocą dwóch cyfr, a inspect zwraca #<Track "Dune" 185s>, z tytułem ujętym w cudzysłowy.
Dostarczony kod odczytuje utwory z wierszy w formacie title,artist,seconds, wyświetla każdy z nich za pomocą puts, a następnie wyświetla całą listę za pomocą p.
Umieść swój kod w pliku track.rb. Plik main.rb zawiera dostarczony kod wejścia/wyjścia i nie można go edytować.
Spróbuj swoich sił
require_relative 'track'
# Dostarczony kod wejścia/wyjścia: pozostaw go bez zmian
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
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Programowanie obiektowe
1Klasy i obiekty
Praca z plikamiDefiniowanie klasZmienne instancjiMetody i selfto_s i inspectPowtórzenie – karta biblioteczna4Hermetyzacja
Metody prywatneMetody chronionePrywatne setteryOchrona stanuPowtórzenie – automat vendingowy7Polimorfizm i typowanie kacze
PolimorfizmTypowanie kaczeMetody abstrakcyjnecase i klasyPowtórzenie – metody płatności10Wzorce projektowe, część 2
Delegowanie z ForwardableWzorzec dekoratoraWzorzec budowniczegoWzorzec stanu2Metody dostępowe i self
Gettery i setteryWłasne setteryself w metodachTożsamość i równośćPowtórzenie – lista kontaktów5Dziedziczenie
PodklasyNadpisywanie metodWywoływanie superis_a? i przodkowiePowtórka – lista płac pracowników8Metody specjalne
Równość i hashMetody operatorówIndeksowanie i dodawanieWłasne kolekcjePowtórka – ułamki11Projekt: Zarządzanie biblioteką
Książki i czytelnicyWypożyczanie książekPoćwicz samodzielnie: Kompilator Ruby online