はじめに
弊社の採用フローの中には技術面接が含まれています。
その時に、Ruby でループ処理やメソッドの中に登場する return
、break
、next
について質問をいただいたので、記事にもまとめておきます。
この記事では、それぞれの違いを簡潔にまとめ、サンプルコードとともに解説していきます。
return, next, break の違い
return
return
は メソッドやブロックから抜け出す(処理を終わらせる) ときに使います。
def greet(name)
return "Hello, NoName..." if name.empty?
"Hello, #{name}!"
end
puts greet("") # => "Hello, NoName..."
puts greet("Taro") # => "Hello, Taro!"
- 空文字が与えらた時に処理終了&値を返す
- それ以外の場合は
"Hello, #{name}!"
が返される
注意点
- ループ処理の中で
return
を使うと、ループだけでなくメソッドごと抜けて しまいます。
def method_with_return
[1, 2, 3, 4, 5].each do |num|
if num == 3
return "return が呼ばれたのでメソッドごと抜けます"
end
puts "method_with_return: #{num}"
end
"ここには到達しません"
end
puts "method_with_return の結果 => #{method_with_return}"
# 実行結果:
# method_with_return: 1
# method_with_return: 2
# method_with_return の結果 => return が呼ばれたのでメソッドごと抜けます
# 4,5も"ここには到達しません"も出力されません。
break の使い方
break
は 現在のループ処理を途中で抜ける ときに使います。
numbers = [1, 2, 3, 4, 5]
numbers.each do |num|
if num == 3
break # ここでループそのものを終了
end
puts num
end
# 実行結果:
# 1
# 2
-
num == 3
でbreak
が呼び出されると、その瞬間にループ処理自体が終了。 -
4
,5
は出力されない。
注意点
-
break
に引数を渡すと、「反復メソッドの戻り値」 となります。result = [1, 2, 3].each do |num| break "Stopped!" if num == 2 puts num end puts result # => "Stopped!"
-
2 重ループ以上の場合、
break
は 書かれたループを抜けるだけ なので、深い階層を一気に抜けたいときはフラグ変数やthrow
/catch
を検討しましょう。
next の使い方
next
は 現在のイテレーション(繰り返し回)をスキップ して、次の繰り返しへ進みたいときに使います。
numbers = [1, 2, 3, 4, 5]
numbers.each do |num|
if num == 3
next # この回だけ処理をスキップ
end
puts num
end
# 実行結果:
# 1
# 2
# 4
# 5
-
num == 3
のタイミングだけ処理を飛ばし、ループはそのまま続行。
注意点
- 中断ではなく「飛ばす」 だけなので、ループ自体は終わらせたくないが、特定条件時の処理だけパスしたいときに使います。
まとめ
キーワード | 主な使い所 | 動作 | 使われるシーン |
---|---|---|---|
return | メソッド・ブロック | メソッド/ブロックの処理を打ち切り値を返す | メソッドの処理結果を返す、ブロック内の処理を終了する |
break | ループ全般 | ループ自体を抜ける | 繰り返しを完全に打ち切りたい |
next | ループ全般 | その繰り返し回をスキップし次の繰り返しへ進む | 特定条件のときだけ処理を飛ばし、ループは続行させたい |
-
return
: メソッドごと抜ける -
break
: ループ処理から抜ける -
next
: ループ処理の「その回」をスキップする
最後に
return, next, break の違いをまとめましたが、実務でももちろん使うものです。
必ず復習して理解しておくようにしましょう!