建立在Ruby中使用Inject的直觉

建立在Ruby中使用Inject的直觉,ruby,Ruby,我试图理解如何以及何时认识到在Ruby代码中inject/reduce更有用。例如,我知道我可以这样做: def add(numbers) sum = 0 numbers.each { |n| sum += n } sum end 可“减少”为: 然而,我没有看到的是,当你有一个稍微复杂一点的表达式时,它是如何工作的。以下是我正在努力解决的问题: def process_data(condition, data) condition.each do |key, value|

我试图理解如何以及何时认识到在Ruby代码中inject/reduce更有用。例如,我知道我可以这样做:

def add(numbers)
  sum = 0
  numbers.each { |n| sum += n }
  sum
end
可“减少”为:

然而,我没有看到的是,当你有一个稍微复杂一点的表达式时,它是如何工作的。以下是我正在努力解决的问题:

def process_data(condition, data)
  condition.each do |key, value|
    data = method("query_#{key}").call(data, value)
  end
  data
end
其中一个问题是,我对
数据进行了变量跟踪,但我仍然很难找到一种方法将其视为我正在注入的东西

有没有一种方法可以让人们把这个习语变成一种启发性的方法,你可以很容易地遵循?我觉得我在Ruby中遇到了这些困难,花了更多的时间试图成为一个地道的Ruby

所以我想我最好的问题是:我展示的
process\u data
方法是否应该进行重构,以使用reduce/inject作为惯用的Ruby?

如何

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

您的第一个示例可以简化为更多的
数字。减少(:+)
这绝对是个好办法!我欣赏这个简明的例子。现在,我只需要到达一个点,我可以从我倾向于创建的代码到您刚才展示给我的代码。好吧,如果您有一个数组,您希望通过应用循环逻辑将其简化为一个结果,那么您可能可以使用reduce:)
def process_data(condition, data)
  condition.reduce(data) { |data, (key,value)| method("query_#{key}").call(data, value) }
end