如果我想做这样的事:
collection.each do |i| return nil if i == 3 ..many lines of code here.. end
我怎样才能达到这样的效果呢?我知道我可以将块中的所有内容都 Package 在一个大的if语句中,但如果可能的话,我想避免嵌套。Break在这里不起作用,因为我“不”想要停止其余元素的迭代。
rhfm7lfc1#
块内的next从该块返回。块内的break从屈服于该块的函数返回。对于each,这意味着break退出循环,next跳到循环的下一次迭代(由此得名)。可以使用next value和break value返回值。
next
break
each
next value
break value
yb3bgrhw2#
# !/usr/bin/ruby collection = [1, 2, 3, 4, 5 ] stopped_at = collection.each do |i| break i if i == 3 puts "Processed #{i}" end puts "Stopped at and did not process #{stopped_at}"
olhwl3o23#
在这种情况下,您可以使用Break提前终止循环:
collection.each do |i| break if i == 3 ...many lines end
...当然,这是假设您实际上并不想返回值,只是想要跳出这个块。
14ifxucb4#
虽然这很古老,但有时还是会让我感到困惑。对于[].select {|x| }/[].reject {|x| }的更复杂用例,我需要使用它。常见用例
[].select {|x| }
[].reject {|x| }
[1,2,3,4,5].select{|x| x % 2 == 0 } => [2, 4]
但我需要为每次迭代生成一个特定值并继续处理用更复杂的逻辑:
[1,2,3,4,5].select{|x| if x % 2 == 0; next true; end; false } => [2, 4] # you can also use `next(true)` if it's less confusing
此外,因为它与线程相关,所以在这里使用break将在条件满足时发出您传递的单个值:
[1,2,3,4,5].select{|x| if x % 2 == 0; break(true); end; false } => true [1,2,3,4,5].select{|x| if x % 2 == 0; break(false); end; false } => false [1,2,3,4,5].select{|x| if x % 2 == 0; break('foo'); end; false } => "foo"
4条答案
按热度按时间rhfm7lfc1#
块内的
next
从该块返回。块内的break
从屈服于该块的函数返回。对于each
,这意味着break
退出循环,next
跳到循环的下一次迭代(由此得名)。可以使用next value
和break value
返回值。yb3bgrhw2#
olhwl3o23#
在这种情况下,您可以使用Break提前终止循环:
...当然,这是假设您实际上并不想返回值,只是想要跳出这个块。
14ifxucb4#
虽然这很古老,但有时还是会让我感到困惑。对于
[].select {|x| }
/[].reject {|x| }
的更复杂用例,我需要使用它。常见用例
但我需要为每次迭代生成一个特定值并继续处理
用更复杂的逻辑:
此外,因为它与线程相关,所以在这里使用
break
将在条件满足时发出您传递的单个值: