Gettery i settery
Część sekcji Programowanie obiektowe ścieżki Ruby w Coddy. Lekcja 7 z 57.
Pisanie metody odczytującej dla każdej zmiennej instancji jest powtarzalne. attr_reader :title w treści klasy generuje metodę title, która zwraca @title. W jednym wierszu można wymienić kilka nazw:
class Book
attr_reader :title, :pages
def initialize(title, pages)
@title = title
@pages = pages
end
end
book = Book.new("Dune", 412)
puts book.title
puts book.pagesWynik:
Dune
412attr_writer :title generuje setter, metodę title=, która zapisuje swój argument w @title. Ruby pozwala wywołać ją za pomocą składni przypisania: book.title = "Emma":
class Book
attr_reader :title
attr_writer :title
def initialize(title)
@title = title
end
end
book = Book.new("Dune")
book.title = "Dune Messiah"
puts book.titleWynik:
Dune Messiahattr_accessor generuje zarówno metodę odczytującą, jak i ustawiającą. Gdy obie są dostępne, działa też skrócony zapis, taki jak +=, ponieważ player.score += 5 oznacza player.score = player.score + 5:
class Player
attr_accessor :name, :score
def initialize(name)
@name = name
@score = 0
end
end
ada = Player.new("Ada")
ada.score += 5
ada.score += 3
ada.name = "Ada L."
puts "#{ada.name}: #{ada.score}"Wynik:
Ada L.: 8Udostępniaj jak najmniej. Użyj attr_reader dla wartości, które kod zewnętrzny może odczytywać, ale nie zmieniać, i dodaj metodę zapisu tylko wtedy, gdy możliwość zmiany wartości z zewnątrz jest częścią projektu. Przypisanie wartości do atrybutu tylko do odczytu powoduje błąd NoMethodError:
class Book
attr_reader :title
def initialize(title)
@title = title
end
end
book = Book.new("Dune")
begin
book.title = "Emma"
rescue NoMethodError => e
puts e.message
end
puts book.titleWynik:
undefined method `title=' for an instance of Book
DuneWyzwanie
ŁatwyUzupełnij klasę Book. Kod zewnętrzny może odczytywać title, author i pages, a także odczytywać i zmieniać pages_read, którego początkowa wartość wynosi 0. progress zwraca Dune: 120/412 (29%), przy czym procent jest zaokrąglany w dół.
Dostarczony kod tworzy książkę na podstawie pierwszych trzech wierszy wejściowych (tytuł, autor, liczba stron). Każdy kolejny wiersz zawiera liczbę stron, które czytelnik przeczytał; kod dodaje każdą z nich za pomocą book.pages_read += n. Na koniec wypisuje Dune by Frank Herbert i postęp.
Twój kod umieść w pliku book.rb. main.rb zawiera dostarczony kod wejścia/wyjścia i nie można go edytować.
Spróbuj swoich sił
require_relative 'book'
# Dostarczony kod wejścia/wyjścia: pozostaw go bez zmian
input = []
while (line = gets)
input << line.chomp
end
book = Book.new(input[0], input[1], input[2].to_i)
input.drop(3).each { |n| book.pages_read += n.to_i }
puts "#{book.title} by #{book.author}"
puts book.progress
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