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.class
でmain
のクラスを見るとObject。Objectクラスのインスタンスがmain
。
ObjectにはKernelモジュールがincludeされているので、トップレベルでp
やputs
が使える。
チェリー本にあった内容、なんだか点と点が繋がってきた感覚。
参考