Faisant référence à une variable locale à partir d'un Proc définie dans un autre champ d'application
-
28-10-2019 - |
Question
Je veux créer une méthode d'instance qui varie son comportement à valeur de retour d'un autre procédé en fonction d'une mise en œuvre des écrasements de façon polymorphique.
Par exemple, la classe suivante est supposée être étendue et pricing_rule
est censé changer en fonction d'un produit.
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>
Mais, je deviens une erreur variable locale définie quand je lance ça. Bien que je comprends que l'instance de Proc fait référence à une instance d'achat, je situations similaires rencontrées parfois je dois lieu variable prices
en méthode discount_price. Y at-il de façon plus intelligente de se référer à la variable locale dans un appelant d'un Proc?
La solution
J'attendais pas à des variables locales de discount_price
soient accessibles à l'intérieur du Proc
retourné par pricing_rule
. En passant dans prices
fonctionnera:
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