Menu
Coddy logo textTech

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

Ausgabe:

Dune
412

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

Ausgabe:

Dune Messiah

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