在Ruby中使用带参数的procs/lambdas 编辑以包括SSCE
我有一个Proc对象,与其他Proc一起添加到散列中:在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实例变量放入此过程的范围。因此,稍后当我在另
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购物车,我会觉得更干净,以防编写规则的人忘记自己做这件事。