我怎么才能从一个街区提前还东西呢?

8fsztsew  于 2022-10-15  发布在  Ruby
关注(0)|答案(4)|浏览(179)

如果我想做这样的事:

collection.each do |i|
   return nil if i == 3

   ..many lines of code here..
end

我怎样才能达到这样的效果呢?我知道我可以将块中的所有内容都 Package 在一个大的if语句中,但如果可能的话,我想避免嵌套。
Break在这里不起作用,因为我“不”想要停止其余元素的迭代。

rhfm7lfc

rhfm7lfc1#

块内的next从该块返回。块内的break从屈服于该块的函数返回。对于each,这意味着break退出循环,next跳到循环的下一次迭代(由此得名)。可以使用next valuebreak value返回值。

yb3bgrhw

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}"
olhwl3o2

olhwl3o23#

在这种情况下,您可以使用Break提前终止循环:

collection.each do |i|
  break if i == 3
  ...many lines
end

...当然,这是假设您实际上并不想返回值,只是想要跳出这个块。

14ifxucb

14ifxucb4#

虽然这很古老,但有时还是会让我感到困惑。对于[].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"

相关问题