在Ruby中使用带有参数的procs / lambdas

时间:2012-07-23 11:33:47

标签: ruby lambda scope proc

编辑包括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对象中的cart变量?
  4. 我过度思考或以错误的方式处理问题?
  5. 完整代码很长,所以我会在下面发布一个gist

    https://gist.github.com/3163127

1 个答案:

答案 0 :(得分:3)

您的规则过程必须接受购物车作为参数,对其采取行动并返回修改后的购物车。

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}