我有一个迭代两个范围的代码。请参阅以下示例:
(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是否有这种类型的环路折叠的首选方式?如果没有,还有其他替代方法吗?
答案 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
这使深层嵌套不受逻辑限制,并使你的意图清晰。