带局部变量的Ruby方法 - 一个简单的重构案例

时间:2016-01-30 16:11:29

标签: ruby

我的方法目前是这样的:

def calculate
  bill = 0
  order.each {|k, v| bill += restaurant.show_menu[k]*v}
  bill  
end

它看起来很难看,但我需要它才能返回bill。考虑将bill作为一个实例变量,然后在我的对象初始化时定义它,但我不在其他任何地方使用它。什么是重构这个的最好方法?

2 个答案:

答案 0 :(得分:7)

这是一种可能的方式:

 def calculate
    order.reduce(0) {|bill, (k, v)| bill + restaurant.show_menu[k]*v}
 end

答案 1 :(得分:3)

def calculate
  order.map { |k, v| restaurant.show_menu[k] * v }.reduce(:+)
end

map返回包含值的数组; reduce对每个元素应用:+方法,这意味着对它们进行总结。