循环在Ruby中折叠 - 迭代两个范围的组合

时间:2016-02-02 08:33:15

标签: ruby

我有一个迭代两个范围的代码。请参阅以下示例:

(0..6).each do |wday|
  (0..23).each do |hour|
    p [wday,hour]
  end
end

虽然这看起来非常简洁和可读,但有时候5行可能太多了。人们可能想要写一个更垂直的紧凑代码。

(0..6).to_a.product((0..23).to_a).each do |wday,hour|
  p [wday, hour]
end

上面是我的尝试,但代码对我来说看起来非常人为。我错过了什么吗? ruby是否有这种类型的环路折叠的首选方式?如果没有,还有其他替代方法吗?

1 个答案:

答案 0 :(得分:4)

以下是循环的稍微清洁版本:

[*0..6].product([*0..23]).each do |wday,hour|
  p [wday, hour]
end

这种方法的缺点是将范围扩展到内存中。

我认为我首选的“折叠”循环方式,特别是如果特定的循环结构发生在多个地方,就是将嵌套循环转换为一个方法,该方法需要一个块和yield s。 E.g。

def for_each_hour_in_week
  (0..6).each do |wday|
    (0..23).each do |hour|
      yield wday,hour
    end
  end
end

for_each_hour_in_week do |wday,hour|
  p [wday,hour]
end

这使深层嵌套不受逻辑限制,并使你的意图清晰。