Ссылка на локальную переменную из Proc, определенного в другой области видимости - PullRequest
3 голосов
/ 03 мая 2011

Я хочу создать метод экземпляра, который изменяет свое поведение с возвращаемым значением другого метода в зависимости от реализации его перезаписи полиморфным способом.

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

1 Ответ

4 голосов
/ 03 мая 2011

Я бы не ожидал, что локальные переменные 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
...