Menu
Coddy logo textTech

Benutzerdefinierte Setter

Teil des Abschnitts Objektorientierte Programmierung der Ruby-Journey von Coddy. Lektion 8 von 57.

Ein Setter ist eine Methode, deren Name mit = endet. Wenn du ihn selbst schreibst, anstatt attr_writer zu verwenden, kannst du den Wert vor dem Speichern bereinigen:

class Person
  attr_reader :name

  def name=(value)
    @name = value.strip.capitalize
  end
end

ada = Person.new
ada.name = "   aDA  "
puts "[#{ada.name}]"

Ausgabe:

[Ada]

Ein Setter kann einen Wert auch ablehnen, indem er einen Fehler auslöst. Die Instanzvariable wird nur zugewiesen, wenn der Wert die Prüfung besteht, sodass das Objekt seinen alten Zustand beibehält:

class Product
  attr_reader :price

  def initialize(price)
    @price = price
  end

  def price=(value)
    raise ArgumentError, "price must be positive, got #{value}" if value <= 0

    @price = value
  end
end

item = Product.new(10)
begin
  item.price = -5
rescue ArgumentError => e
  puts e.message
end
puts item.price

Ausgabe:

price must be positive, got -5
10

Ein Zuweisungsausdruck gibt immer den Wert auf seiner rechten Seite zurück, nicht das, was der Setter zurückgibt oder speichert. Lies das Attribut erneut aus, um den gespeicherten Wert zu sehen:

class Thermometer
  attr_reader :celsius

  def celsius=(value)
    @celsius = value.round
  end
end

t = Thermometer.new
result = (t.celsius = 21.7)
puts result
puts t.celsius

Ausgabe:

21.7
22

Ein Reader und ein benutzerdefinierter Setter ergeben zusammen ein Attribut, das von Code außerhalb der Klasse gelesen und geändert werden kann, aber nur auf gültige Werte. Führe die Prüfung ausschließlich im Setter durch, damit jede Änderung dieselbe Regel durchläuft:

class Volume
  attr_reader :level

  def level=(value)
    raise ArgumentError, "level must be 0-10" unless (0..10).cover?(value)

    @level = value
  end
end
challenge icon

Aufgabe

Einfach

Vervollständige die Klasse Person. Ihr Setter name= entfernt Leerzeichen um den Wert und schreibt jedes Wort groß ( ada lovelace wird zu Ada Lovelace). Ihr Setter age= löst ArgumentError mit der Meldung invalid age: 200 aus, wenn das Alter außerhalb des Bereichs von 0 bis 150 liegt, und speichert es andernfalls. Beide Werte können gelesen werden.

Ein neues Person-Objekt beginnt mit dem Namen Unknown und dem Alter 0. Der bereitgestellte Code liest die Befehle name text oder age n, wendet sie über die Setter an und gibt die Person nach jedem Befehl als Ada Lovelace (36) aus oder die Fehlermeldung, wenn ein Setter den Wert ablehnt.

Dein Code gehört in person.rb. main.rb enthält den bereitgestellten Ein-/Ausgabecode und kann nicht bearbeitet werden.

Probier es selbst

require_relative 'person'

# Gelieferter Ein-/Ausgabecode: belasse ihn so wie er ist
input = []
while (line = gets)
  input << line.chomp
end
person = Person.new
input.each do |line|
  command, value = line.split(" ", 2)
  begin
    command == "name" ? person.name = value : person.age = value.to_i
    puts "#{person.name} (#{person.age})"
  rescue ArgumentError => e
    puts e.message
  end
end
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