AtCoderで使ってるreturnって何?

AtCoderにてループを抜けるのにreturnをよく使っている。
配列をループさせ該当するものがあれば何か出力して終了、該当しない場合は別の文字を返すというような問題。

sum = 0
numbers.each do |n|
  sum += n
  return puts '10を超えたよ' if sum > 10
end
puts '10を超えなかったよ'

配列numbersの要素を次々にsumに加えていって、sumが10超えたところで「10を超えたよ」、最終的に超えなければ「10を超えなかったよ」と出力される。

先日@haruguchiさん主催のモブプロ会にて、いつも通りreturnを使ったんだが、このreturnってどうなってるんだっけと言語化できなかったのでメモ。

結論:トップレベルでのreturnなので、出力後にそのままプログラムが終了した

array.each do |a|
  # トップレベルでの return なのでループを抜けるのではなくプログラムを抜ける
  return puts 'foo' if condition
end

上のコードの様々な箇所でp selfとすると、全てmainが返る。mainというのはトップレベルでselfを表すもの。
今回は何もメソッドやクラス、モジュールを作成していないので、eachの中でだろうが外だろうが、そこはトップレベルにある。
returnはメソッドからの脱出という認識でいたが、

トップレベルで return した場合はプログラムが終了します。

制御構造 (Ruby 3.2 リファレンスマニュアル)にそのまま書いてあった。
(といっても実務でのreturnは早期リターン(ガード節)で使い、このような使われ方はなさそうな気が。)

プログラム全体を終了させるKernel.#exit (Ruby 2.7.0 リファレンスマニュアル)と同じことができる。

sum = 0
numbers.each do |n|
  sum += n
  if sum > 10
    puts '10を超えたよ'
    exit
  end
end
puts '10を超えなかったよ'

ちなみにp self.classmainのクラスを見るとObject。Objectクラスのインスタンスmain
ObjectにはKernelモジュールがincludeされているので、トップレベルでpputsが使える。
チェリー本にあった内容、なんだか点と点が繋がってきた感覚。

参考