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.priceAusgabe:
price must be positive, got -5
10Ein 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.celsiusAusgabe:
21.7
22Ein 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
endAufgabe
EinfachVervollstä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
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