Ссылка на локальную переменную из Proc, определенного в другой области видимости
Я хочу создать метод экземпляра, который изменяет свое поведение с возвращаемым значением другого метода в зависимости от реализации его перезаписи полиморфным способом.
Например, следующий класс предполагается расширенным и pricing_rule
должен меняться в зависимости от продукта.
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>
Но я получаю неопределенную ошибку локальной переменной при запуске этого. Хотя я понимаю, что экземпляр Proc относится к экземпляру Покупки, я иногда сталкивался с подобными ситуациями, которые мне нужно разместить prices
переменная в методе discount_price. Есть ли какой-нибудь более умный способ обратиться к локальной переменной в вызывающей программе Proc?
1 ответ
Я бы не ожидал discount_price
локальные переменные должны быть доступны внутри Proc
вернулся pricing_rule
, Переходя prices
в будет работать:
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