在Ruby中使用带参数的procs/lambdas 编辑以包括SSCE

在Ruby中使用带参数的procs/lambdas 编辑以包括SSCE,ruby,lambda,scope,proc,Ruby,Lambda,Scope,Proc,我有一个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实例变量放入此过程的范围。因此,稍后当我在另

我有一个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
实例变量放入此过程的范围。因此,稍后当我在另一个方法中迭代所有这些
规则时,我会得到
未定义的变量
错误

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


我有一个
checkout
对象,它包含一个包含
项的购物车(数组)
对象<代码>项目具有以下属性:
code
price
name

接下来我有一个
Promotion
对象,它包含
促销规则的散列。此哈希包含保存这些规则的
Proc
对象(这些规则是每个在购物车对象上运行的函数,用于更改购物车的最终价格)。可以通过调用方法并将名称作为参数来添加和删除规则

我遇到的问题是当我遍历
促销规则的散列时。我不知道如何使
cart
对象进入那些
Proc
对象的范围,以便运行那些
Proc
对象中包含的函数,从而更改
cart
状态

  • 在创建Proc/lambda时是否传入cart对象
  • 促销
    对象中创建购物车实例变量并设置/获取它
  • checkout
    对象中以某种方式传入cart变量
  • 我想得太多了,或者以错误的方式处理问题
  • 完整的代码相当长,因此我将在下面发布一个
    gist


    您的规则进程必须接受cart作为参数,对其执行操作,然后返回修改后的cart

    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}
    

    请试着把这个减到一个。我们这样帮助你会容易得多。哇,你在这段代码中有很多副作用,你将很难(至少我会)对它的正确性进行推理。根据经验,最小化状态并尽可能纯粹地使用方法/函数(使用参数/return_值中的输入/输出,不使用实例变量更新)。我会处理它。感谢您的输入。如果调用方
    dup
    s购物车,我会觉得更干净,以防编写规则的人忘记自己做这件事。