引用另一个范围中定义的Proc的局部变量

时间:2011-05-03 13:27:37

标签: ruby proc-object

我想创建一个实例方法,该方法使用另一种方法的返回值改变其行为,具体取决于其以多态方式覆盖的实现。

例如,假设以下类被扩展,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 个答案:

答案 0 :(得分:4)

我不希望在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