Riferimento a una variabile locale da un Proc definito in un altro ambito
-
28-10-2019 - |
Domanda
Voglio creare un metodo di istanza che varia il suo comportamento con il valore restituito di un altro metodo a seconda dell'implementazione delle sue sovrascritture in modo polimorfico.
Ad esempio, si presuppone che la seguente classe sia estesa e pricing_rule
dovrebbe cambiare a seconda del prodotto.
class Purchase
def discount_price
prices = [100, 200, 300]
pricing_rule.call
end
protected
def pricing_rule
Proc.new do
rate = prices.size > 2 ? 0.8 : 1
total = prices.inject(0){|sum, v| sum += v}
total * rate
end
end
end
Purchase.new.discount_price
#=> undefined local variable or method `prices' for #<Purchase:0xb6fea8c4>
Ma ricevo un errore di variabile locale non definita quando lo eseguo.Anche se capisco che l'istanza di Proc si riferisce a un'istanza di Purchase, a volte mi sono imbattuto in situazioni simili che devo inserire prices
variabile nel metodo discount_price.Esiste un modo più intelligente per fare riferimento alla variabile locale in un chiamante di un Proc?
Soluzione
Non me lo aspetterei discount_price
le variabili locali siano accessibili all'interno del file Proc
restituito da pricing_rule
.Passando prices
funzionerà:
class Purchase
def discount_price
prices = [100, 200, 300]
pricing_rule.call prices
end
protected
def pricing_rule
Proc.new do |prices|
rate = prices.size > 2 ? 0.8 : 1
total = prices.inject(0){|sum, v| sum += v}
total * rate
end
end
end