3

ポリモーフィックな方法で上書きの実装に応じて、別のメソッドの戻り値で動作を変化させるインスタンス メソッドを作成したいと考えています。

たとえば、次のクラスは拡張されると想定され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 の呼び出し元でローカル変数を参照するスマートな方法はありますか?

4

1 に答える 1

4

discount_priceのローカル変数がProc返された by内でアクセスできるとは思わないでしょう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
于 2011-05-03T13:42:10.543 に答える