Leser und Schreiber
Teil des Abschnitts Objektorientierte Programmierung der Ruby-Journey von Coddy. Lektion 7 von 57.
Eine Reader-Methode für jede Instanzvariable zu schreiben, ist repetitiv. attr_reader :title im Klassenrumpf erzeugt die Methode title, die @title zurückgibt. Eine Zeile kann mehrere Namen auflisten:
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.pagesAusgabe:
Dune
412attr_writer :title erzeugt einen Setter, die Methode title=, die ihr Argument in @title speichert. Ruby erlaubt dir, sie mit der Zuweisungssyntax book.title = "Emma" aufzurufen:
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.titleAusgabe:
Dune Messiahattr_accessor erzeugt sowohl den Leser als auch den Setter. Wenn beide vorhanden sind, funktioniert auch die Kurzschreibweise wie +=, denn player.score += 5 bedeutet 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}"Ausgabe:
Ada L.: 8Gib so wenig wie möglich nach außen frei. Verwende attr_reader für Werte, die von externem Code gelesen, aber nicht geändert werden dürfen, und füge einen Writer nur dort hinzu, wo das Ändern des Werts von außen Teil des Designs ist. Eine Zuweisung an ein Attribut, für das es nur einen Reader gibt, löst NoMethodError aus:
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.titleAusgabe:
undefined method `title=' for an instance of Book
DuneAufgabe
EinfachVervollständige die Klasse Book. Code außerhalb der Klasse kann title, author und pages lesen sowie pages_read lesen und ändern, das mit 0 beginnt. progress gibt Dune: 120/412 (29%) zurück, wobei der Prozentwert abgerundet wird.
Der bereitgestellte Code erstellt aus den ersten drei Eingabezeilen (Titel, Autor, Seitenzahl) ein Buch. Jede folgende Zeile gibt eine Anzahl von Seiten an, die der Leser geschafft hat; der Code addiert jeden Wert mit book.pages_read += n. Schließlich gibt er Dune by Frank Herbert und den Fortschritt aus.
Dein Code gehört in book.rb. main.rb enthält den bereitgestellten Ein-/Ausgabecode und kann nicht bearbeitet werden.
Probier es selbst
require_relative 'book'
# Vorgegebener Ein-/Ausgabecode: unverändert lassen
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
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Objektorientierte Programmierung
1Klassen und Objekte
Arbeiten mit DateienKlassen definierenInstanzvariablenMethoden und selfto_s und inspectRückblick – Bibliotheksausweis4Kapselung
Private MethodenGeschützte MethodenPrivate SetterZustand schützenRückblick – Verkaufsautomat7Polymorphismus und Duck Typing
PolymorphismusDuck TypingAbstrakte MethodenFälle und KlassenRückblick – Zahlungsmethoden2Getter und Setter sowie self
Leser und SchreiberBenutzerdefinierte Setterself in MethodenIdentität und GleichheitWiederholung – Kontaktliste5Vererbung
UnterklassenMethoden überschreibensuper aufrufenis_a? und VorfahrenRückblick – Gehaltsabrechnung des Personals8Spezielle Methoden
Gleichheit und HashOperator-MethodenIndexieren und AnhängenBenutzerdefinierte CollectionsRückblick – Brüche11Projekt: Bibliotheksverwaltung
Bücher und MitgliederBücher ausleihenÜbe selbstständig: Online-Ruby-Compiler