构建在Ruby中使用Inject的直觉

时间:2015-07-07 22:34:42

标签: ruby

我试图了解如何以及何时认识到注入/减少在Ruby代码中更有用。所以,例如,我知道我可以接受这个:

def add(numbers)
  sum = 0
  numbers.each { |n| sum += n }
  sum
end

可以“减少”为:

numbers.inject(0) { |sum, n| sum += n }

然而,我没有看到的是当你有一个稍微复杂的表达时它是如何工作的。这是我正在挣扎的:

def process_data(condition, data)
  condition.each do |key, value|
    data = method("query_#{key}").call(data, value)
  end
  data
end

其中一个问题是我用data变量阴影,但我仍然很难找到一种方法来将其视为我注射的东西。

人们是否有办法将这个成语变成你可以轻易遵循的启发式?我认为这些事情在Ruby中很难实现,花费更多的时间来尝试成为惯用的Ruby。

所以我想也许我的更好的问题是:process_data方法是否显示 应该重构以使用reduce / inject来成为惯用的Ruby?

1 个答案:

答案 0 :(得分:2)

怎么样?

def process_data(condition, data)
  condition.reduce(data) { |data, (key,value)| method("query_#{key}").call(data, value) }
end