我从来不需要在Ruby中这样做,但我的老板,作为一名C程序员,给我一个问题,我真的无法在Ruby中提供一个优雅的解决方案,而基本上没有在C中做到这一点方式(使用两个“break”语句跟踪变量)。
我们遇到这样的情况(解析XML):
(1..1000).each do |page|
fetch_page(page).results.each do |results|
do_something_with_results!
break if results[:some_value] > another_value # this needs to exit BOTH blocks
end
end
我能做到这一点的唯一方法是,我不会将其描述为非常类似Ruby,而更像是一种C语言思维方式。类似的东西:
(1..1000).each do |page|
should_break = false
fetch_page(page).results.each do |results|
do_something_with_results!
if results[:some_value] > another_value
should_break = true
break
end
end
break if should_break
end
对我而言,这感觉完全错误且不像Ruby一样,但是功能方法是什么?
答案 0 :(得分:4)
catch (:break) do
(1..1000).each do |page|
fetch_page(page).results.each do |results|
do_something_with_results!
throw :break if results[:some_value] > another_value # this needs to exit BOTH blocks
end
end
end
编辑: @ CaptainPete上面的评论是现货。如果你可以把它变成一个函数,它有很大的附带好处(单元测试是主要的)。
答案 1 :(得分:-1)
这取决于您的具体情况。
如果数据集不是太大,你可以
results = (1..1000).map{|page_number| fetch_page(page_number).results}.flatten(1)
results.each do
do_something_with_results!
break if results[:some_value] > another_value # this needs to exit BOTH blocks
end
否则你必须做一些让它更懒惰的事情,比如
def each_result(page_numbers)
page_numbers.each do |page_number|
fetch_page(page_number).results.each do |result|
yield result
end
end
end
我确信还有很多其他方法可以让你变得懒惰。