1

编辑以包括 SSCE

我有一个 Proc 对象,我将它与其他 Procs 添加到 Hash 中:

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数组包含items. 但是,我无法将我的cart实例变量放入此 proc 的范围内。rules所以后来当我用另一种方法遍历所有这些时,我得到了undefined variable错误。

这样做的目的是我有各种促销规则(功能)需要在这个购物车对象上运行。可能有更好的存储方法rules可以迭代地应用于对象实例变量。


我有checkout一个包含对象购物车(数组)的item对象;items具有以下属性codepricename

接下来我有一个Promotion对象,其中包含promotional rules. 这个散列包含Proc持有这些规则的对象(它们是每个在购物车对象上运行的函数,改变购物车的最终价格)。可以通过调用方法并将名称作为参数来添加和删除规则。

我遇到的问题是当我遍历promotional rules. 我不知道如何将cart对象放入这些对象的范围内,Proc以便运行这些对象中包含的函数Proc,从而改变cart状态。

  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 回答