我试图了解如何以及何时认识到注入/减少在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?
答案 0 :(得分:2)
怎么样?
def process_data(condition, data)
condition.reduce(data) { |data, (key,value)| method("query_#{key}").call(data, value) }
end