Menu
CoddyTech

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.pages

Ausgabe:

Dune
412

attr_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.title

Ausgabe:

Dune Messiah

attr_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.: 8

Gib 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.title

Ausgabe:

undefined method `title=' for an instance of Book
Dune
challenge icon

Aufgabe

Einfach

Vervollstä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
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Objektorientierte Programmierung

Übe selbstständig: Online-Ruby-Compiler