Leser und Schreiber
Teil des Abschnitts Objektorientierte Programmierung der Ruby-Journey von Coddy. Lektion 7 von 57.
Eine Lesemethode für jede Instanzvariable zu schreiben, ist repetitiv. attr_reader :title im Klassenrumpf erzeugt die Methode title, die @title zurückgibt. In einer Zeile können mehrere Namen aufgeführt werden:
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 es dir, sie mit der Zuweisungssyntax aufzurufen: 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.titleAusgabe:
Dune Messiahattr_accessor erzeugt sowohl den Getter als auch den Setter. Wenn beide vorhanden sind, funktionieren auch Kurzschreibweisen 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 nur dort einen Writer hinzu, wo das Ändern des Werts von außen Teil des Designs ist. Eine Zuweisung an ein Attribut, für das nur ein Reader vorhanden ist, 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 und pages_read lesen und ändern, wobei der Wert bei 0 beginnt. progress gibt Dune: 120/412 (29%) zurück, wobei der Prozentsatz abgerundet wird.
Der bereitgestellte Code erstellt ein Buch aus den ersten drei Eingabezeilen (Titel, Autor, Seiten). Jede folgende Zeile enthält die Anzahl der Seiten, die der Leser geschafft hat; der Code addiert jede davon 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 Eingabe-/Ausgabecode und darf nicht bearbeitet werden.
Probier es selbst
require_relative 'book'
# Bereitgestellter Ein-/Ausgabe-Code: belasse ihn wie er ist
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