建立在Ruby中使用Inject的直觉
我试图理解如何以及何时认识到在Ruby代码中inject/reduce更有用。例如,我知道我可以这样做:建立在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|
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