Setter personalizzati
Fa parte della sezione Programmazione orientata agli oggetti del percorso Ruby di Coddy. Lezione 8 di 57.
Un setter è un metodo il cui nome termina con =. Scriverlo tu invece di usare attr_writer ti permette di ripulire il valore prima di memorizzarlo:
class Person
attr_reader :name
def name=(value)
@name = value.strip.capitalize
end
end
ada = Person.new
ada.name = " aDA "
puts "[#{ada.name}]"Output:
[Ada]Un setter può anche rifiutare un valore sollevando un errore. La variabile di istanza viene assegnata solo quando il valore supera il controllo, quindi l’oggetto mantiene il suo stato precedente:
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.priceOutput:
price must be positive, got -5
10Un'espressione di assegnazione restituisce sempre il valore sul lato destro, non ciò che il setter restituisce o memorizza. Leggi di nuovo l'attributo per vedere il valore memorizzato:
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.celsiusOutput:
21.7
22Un metodo di lettura e un setter personalizzato insieme forniscono un attributo che il codice esterno può leggere e modificare, ma solo con valori validi. Mantieni il controllo solo nel setter, così ogni modifica segue la stessa regola:
class Volume
attr_reader :level
def level=(value)
raise ArgumentError, "level must be 0-10" unless (0..10).cover?(value)
@level = value
end
endSfida
FacileCompleta la classe Person. Il suo setter name= rimuove gli spazi all’inizio e alla fine del valore e mette in maiuscolo la prima lettera di ogni parola ( ada lovelace diventa Ada Lovelace). Il suo setter age= solleva ArgumentError con il messaggio invalid age: 200 quando l’età è al di fuori dell’intervallo da 0 a 150, altrimenti la memorizza. Entrambi i valori possono essere letti.
Un nuovo Person inizia con il nome Unknown e l’età 0. Il codice fornito legge comandi name text o age n, li applica tramite i setter e stampa la persona come Ada Lovelace (36) dopo ogni comando, oppure stampa il messaggio di errore quando un setter rifiuta il valore.
Il tuo codice va in person.rb. main.rb contiene il codice di input/output fornito e non può essere modificato.
Provalo tu
require_relative 'person'
# Código de entrada/salida proporcionado: mantenlo tal como está
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
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Programmazione orientata agli oggetti
1Classi e oggetti
Lavorare con i fileDefinire le classiVariabili d'istanzaMetodi e selfto_s e inspectRipasso - Tessera della biblioteca4Incapsulamento
Metodi privatiMetodi protettiSetter privatiProteggere lo statoRiepilogo - Distributore automatico7Polimorfismo e Duck Typing
PolimorfismoDuck TypingMetodi astratticase e classiRiepilogo - Metodi di pagamento10Pattern di progettazione Parte 2
Delegazione con ForwardablePattern DecoratorPattern BuilderPattern State2Metodi di accesso e self
Metodi di lettura e scritturaSetter personalizzatiself nei metodiIdentità e uguaglianzaRiepilogo - Elenco contatti5Ereditarietà
SottoclassiRidefinizione dei metodiChiamare superis_a? e antenatiRiepilogo - Paghe del personale8Metodi speciali
Uguaglianza e hashMetodi degli operatoriIndicizzazione e appendCollezioni personalizzateRiepilogo - Frazioni11Progetto: Gestione della biblioteca
Libri e iscrittiPrendere in prestito i libriEsercitati da solo: Compilatore Ruby online