Techioz Blog

明示的なリターンが Proc に違いをもたらすのはなぜですか?

概要

def foo
  f = Proc.new { return "return from foo from inside proc" }
  f.call # control leaves foo here
  return "return from foo" 
end

def bar
  b = Proc.new { "return from bar from inside proc" }
  b.call # control leaves bar here
  return "return from bar" 
end

puts foo # prints "return from foo from inside proc" 
puts bar # prints "return from bar" 

Ruby では return キーワードはオプションであり、要求するかどうかに関係なく常に返されると考えていました。そう考えると、foo と bar の出力が異なるのは、foo に Proc f に明示的な return が含まれているという事実によって決定されることは驚くべきことです。

なぜそうなるのか知っている人はいますか?

解決策

Ruby には 3 つの構造があります。

Ruby には、何かから返される 3 つのキーワードがあります。

ラムダでは、何らかの理由で return は next のように動作します。 next と Break はそれぞれのようなメソッドで最も一般的に使用されるため、このような名前が付けられています。ブロックを終了するとコレクションの次の要素で反復が再開され、それぞれを終了するとループから抜け出すことができます。 。

def foo
  f = Proc.new { next "return from foo from inside proc" }
  f.call # control leaves foo here
  return "return from foo" 
end
puts foo # prints "return from foo"