Menu
Coddy logo textTech

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

Output:

price must be positive, got -5
10

Un'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.celsius

Output:

21.7
22

Un 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
end
challenge icon

Sfida

Facile

Completa 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
quiz iconMettiti alla prova

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

Esercitati da solo: Compilatore Ruby online