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が使える。
チェリー本にあった内容、なんだか点と点が繋がってきた感覚。
参考