Metodi e self
Fa parte della sezione Programmazione orientata agli oggetti del percorso Ruby di Coddy. Lezione 4 di 57.
Un metodo può chiamare un altro metodo dello stesso oggetto senza scrivere un destinatario. Ruby invia la chiamata all'oggetto corrente, così i metodi si basano l'uno sull'altro:
class Order
def initialize(price, quantity)
@price = price
@quantity = quantity
end
def subtotal
@price * @quantity
end
def shipping
subtotal >= 50 ? 0 : 5
end
def total
subtotal + shipping
end
end
puts Order.new(10, 3).total
puts Order.new(20, 3).totalOutput:
35
60All'interno di un metodo, self è l'oggetto su cui è stato chiamato il metodo. Un metodo che restituisce self consente a chi lo chiama di concatenare più chiamate sullo stesso oggetto:
class Counter
def initialize
@count = 0
end
def add(n)
@count += n
self
end
def count
@count
end
end
puts Counter.new.add(2).add(5).countOutput:
7Un oggetto può anche passare se stesso ad altro codice con self, per esempio per restituire il vincitore di un confronto con un altro oggetto della stessa classe:
class Player
def initialize(name, score)
@name = name
@score = score
end
def name
@name
end
def score
@score
end
def winner_against(other)
score >= other.score ? self : other
end
end
ada = Player.new("Ada", 9)
bo = Player.new("Bo", 7)
puts ada.winner_against(bo).name
puts bo.winner_against(ada).nameOutput:
Ada
AdaI nomi dei metodi che rispondono a una domanda sì o no terminano con ?, come empty?. I parametri possono avere valori predefiniti, usati quando chi chiama omette l’argomento:
class Kettle
def initialize
@temp = 20
end
def hot?
@temp >= 90
end
def heat(degrees = 10)
@temp = [@temp + degrees, 100].min
end
end
k = Kettle.new
k.heat
puts k.hot?
k.heat(75)
puts k.hot?Output:
false
trueSfida
FacileCompleta la classe ShoppingCart. add(name, price) memorizza un articolo e restituisce il carrello stesso, così è possibile concatenare le chiamate. total restituisce la somma dei prezzi, free_shipping? restituisce true quando il totale è almeno 20 e summary restituisce 3 items, total 12.50 (oppure 1 item, total 4.00), con due cifre decimali.
Il codice fornito aggiunge un articolo per ogni riga di input (name price) concatenando le chiamate, quindi stampa summary e free shipping: true oppure free shipping: false.
Il tuo codice va in shopping_cart.rb. main.rb contiene il codice di input/output fornito e non può essere modificato.
Provalo tu
require_relative 'shopping_cart'
# Codice di input/output fornito: lascialo così com'è
input = []
while (line = gets)
input << line.chomp
end
cart = input.reduce(ShoppingCart.new) do |c, line|
name, price = line.split
c.add(name, price.to_f)
end
puts cart.summary
puts "free shipping: #{cart.free_shipping?}"
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