1. ホーム
  2. ruby

[解決済み] Rubyのブロックから抜け出すには?

2022-03-22 22:22:31

質問

以下はその例です。 Bar#do_things :

class Bar   
  def do_things
    Foo.some_method(x) do |x|
      y = x.do_something
      return y_is_bad if y.bad? # how do i tell it to stop and return do_things? 
      y.do_something_else
    end
    keep_doing_more_things
  end
end

そして、こちらは Foo#some_method :

class Foo
  def self.some_method(targets, &block)
    targets.each do |target|
      begin
        r = yield(target)
      rescue 
        failed << target
      end
    end
  end
end

raiseを使うことも考えたのですが、汎用的なものにしたいので、特に何も入れずに Foo .

解決方法は?

キーワードを使用する next . 次の項目へ進みたくない場合は break .

いつ next をブロック内で使用すると、ブロックが直ちに終了してイテレータメソッドに制御が戻り、イテレータメソッドはブロックを再呼び出しして新しい反復を開始することができます。

f.each do |line|              # Iterate over the lines in file f
  next if line[0,1] == "#"    # If this line is a comment, go to the next
  puts eval(line)
end

ブロック内で使用する場合。 break は、ブロックの外、ブロックを呼び出したイテレータの外、そしてイテレータの呼び出しに続く最初の式に制御を移します。

f.each do |line|             # Iterate over the lines in file f
  break if line == "quit\n"  # If this break statement is executed...
  puts eval(line)
end
puts "Good bye"              # ...then control is transferred here

そして最後に return をブロックの中に入れてください。

return は、ブロック内でどれだけ深くネストされていても、常に囲んだメソッドを返すようにします (ラムダの場合を除く)。

def find(array, target)
  array.each_with_index do |element,index|
    return index if (element == target)  # return from find
  end
  nil  # If we didn't find the element, return nil
end