1

SSCEを含むように編集

他のProcと一緒にハッシュに追加するProcオブジェクトがあります。

ten_percent_discount_over_sixty = Proc.new {
  cart.each { |item| cart_total += item.price }

  if cart_total >= 60.00
    cart_total =- cart_total * 0.1
  end
}

ご覧のとおり、cartを含む配列がありますitemscartただし、インスタンス変数をこのプロシージャのスコープに入れることはできません。したがって、後でrules別の方法でこれらすべてを繰り返すと、undefined variableエラーが発生します。

これを行うポイントは、このカートオブジェクトで実行する必要のあるさまざまなプロモーションルール(関数)があることです。rulesオブジェクトインスタンス変数に繰り返し適用できる、より良い保存方法がある可能性があります。


checkoutオブジェクトのカート(配列)を含むオブジェクトがありますitemitems属性があります:code、、。pricename

次にPromotion、のハッシュを保持するオブジェクトがありますpromotional rules。このハッシュにはProc、これらのルールを保持するオブジェクトが含まれています(これらは、カートオブジェクトで実行され、カートの最終価格を変更する関数です)。ルールは、メソッドを呼び出し、引数として名前を使用して追加および削除できます。

私が抱えている問題は、のハッシュを反復処理するときですpromotional rules。それらのオブジェクトに含まれる関数を実行して状態を変更するために、オブジェクトcartをそれらのオブジェクトのスコープに入れる方法がわかりません。ProcProccart

  1. Proc / lambdaを作成するときにカートオブジェクトを渡しますか?
  2. オブジェクトにカートインスタンス変数を作成し、Promotion設定/取得しますか?
  3. checkoutどういうわけか、オブジェクト内のカート変数を渡しますか?
  4. 私は間違った方法で問題を考えすぎているか、アプローチしていますか?

完全なコードはかなり長いので、gist以下に投稿します。

https://gist.github.com/3163127

4

1 に答える 1

4

ルールプロシージャは、カートを引数として受け入れ、それに基づいて動作し、変更されたカートを返す必要があります。

cart = {total: 100}

rules = {ten_percent_discount: lambda{|c| c[:total] *= 0.9; c },
  five_percent_discount: lambda{|c| c[:total] *= 0.95; c}}

rules.each do |name, rule|
  cart = rule.call cart.dup
end

cart # => {:total=>85.5}
于 2012-07-23T11:39:46.520 に答える