2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

return, break, next の使い方

Posted at

ループ処理や関数を書いていて、return , break , next をなんとなく使っていたことに気づきました。しっかりと挙動を理解して使っていきたいので、違いをまとめておきます。

ざっくりいうと、return関数そのものを終了します。
breaknextループ内で使うものです。breakループそのものを抜けnextその回だけループを抜けます。

以下で例とともに使い方をまとめます。

目次

1. return
2. break
3. next

1. return

returnは関数内に書きます。returnを書いた箇所で関数自体を終了し、その関数の呼び出し元に戻ります。

def hello
  puts 'こんにちは'
  return
  puts 'お元気ですか?' # 実行されない
end

hello # 関数呼び出し
puts 'さようなら' # 実行される

出力結果:

こんにちは
さようなら

この例では、return の時点で関数 hello が終了するため、その後の puts 'お元気ですか?' は実行されません。
そして hello 関数の呼び出し元に処理が戻るため、次の puts 'さようなら' が実行されます。

return を関数内の eachif の中に書く

return は、関数内の each などのループ処理や if 文の中にも書くことができます。
関数内の eachif 文の中で return した場合、その後の関数内の処理は、 eachif 文の外に書いてあったとしても実行されません。
繰り返しになりますが、return関数自体を終了するためです。

以下は、配列内の一番初めの偶数を見つける関数の例です。
一番初めの偶数を見つけたら、その時点で関数が終了します。

def find_even(nums)
  nums.each do |num|
    if (num % 2).zero?
      puts "#{num}は偶数です!!"
      return # 偶数を見つけたら return
    else
      puts "#{num}は奇数です"
    end
  end
  puts '関数の最後です' # 実行されない
end

find_even([5, 17, 8, 20, 121]) # 関数呼び出し
puts '関数の次の処理です' # 実行される

出力結果:

5は奇数です
17は奇数です
8は偶数です!!
関数の次の処理です

ここでは find_even 関数内の each、さらに if 文の中に return を書いています。関数の最後の puts '関数の最後です' は、eachif 文の外に書いてありますが、return で関数自体が終了されるため実行されません。
return の後は、関数の呼び出し元に処理が戻るため、その後の puts '関数の次の処理です' が実行されます。

2. break

break は、loopwhiletimes など、ループ処理の中で使います。
breakループそのものを抜けますが、関数自体は終了しません。

先ほどと同じ、配列内の一番初めの偶数を見つける関数の例です。

def find_even(nums)
  nums.each do |num|
    if (num % 2).zero?
      puts "#{num}は偶数です!!"
      break # 偶数を見つけたら break
    else
      puts "#{num}は奇数です"
    end
  end
  puts '関数の最後です' # 実行される
end

find_even([5, 17, 8, 20, 121]) # 関数呼び出し

出力結果:

5は奇数です
17は奇数です
8は偶数です!!
関数の最後です

先ほどの return とは違い、関数の最後の puts '関数の最後です' は実行されます。

また2重ループの内側で break を使った場合は、その内側のループのみを抜けます。

def double_loop
  (1..4).each do |x|
    (1..4).each do |y|
      if y == 3
        break # y == 3 で break
      end
      puts "内側ループ x: #{x} y: #{y}"
    end
    puts "外側ループ x: #{x}"
  end
  puts '関数の最後です' # 実行される
end

double_loop # 関数呼び出し

出力結果:

内側ループ x: 1 y: 1
内側ループ x: 1 y: 2
外側ループ x: 1
内側ループ x: 2 y: 1
内側ループ x: 2 y: 2
外側ループ x: 2
内側ループ x: 3 y: 1
内側ループ x: 3 y: 2
外側ループ x: 3
内側ループ x: 4 y: 1
内側ループ x: 4 y: 2
外側ループ x: 4
関数の最後です

内側のループで y == 3 になった時点で、 break により内側のループが終了しています。ですが、その後 x の数は増えていき、外側のループは終わらず続いていることが分かります。

3. next

nextbreak と同様に、loopwhiletimes など、ループ処理の中で使います。
break との違いは、ループそのものではなくその回のループだけを抜けるということです。

Rubyの next は、他言語の continue に相当するものです。

以下は、配列内の数が偶数の場合だけ puts を実行する関数です。奇数の場合は next としてその回のループをスキップしています。

def find_even(nums)
  nums.each do |num|
    if (num % 2).zero?
      puts "#{num}は偶数です!!"
    else
      next # 奇数の場合は next
    end
  end
  puts '関数の最後です' # 実行される
end

find_even([5, 17, 8, 20, 121]) # 関数呼び出し

出力結果:

8は偶数です!!
20は偶数です!!
関数の最後です

また2重ループの内側で next を使った場合は、その内側のループに関して、次のループへスキップします。

def double_loop
  (1..4).each do |x|
    (1..4).each do |y|
      if y == 3 # y == 3 で next
        next
      end
      puts "内側ループ x: #{x} y: #{y}"
    end
    puts "外側ループ x: #{x}"
  end
  puts '関数の最後です'
end

double_loop # 関数呼び出し

出力結果:

内側ループ x: 1 y: 1
内側ループ x: 1 y: 2
内側ループ x: 1 y: 4
外側ループ x: 1
内側ループ x: 2 y: 1
内側ループ x: 2 y: 2
内側ループ x: 2 y: 4
外側ループ x: 2
内側ループ x: 3 y: 1
内側ループ x: 3 y: 2
内側ループ x: 3 y: 4
外側ループ x: 3
内側ループ x: 4 y: 1
内側ループ x: 4 y: 2
内側ループ x: 4 y: 4
外側ループ x: 4
関数の最後です

内側のループで y == 3 の場合のみ next でループをスキップしています。一回スキップしているだけなので、次の y == 4 の時には実行されていますし、その後 x の数は増えているので外側のループも続いていることが分かります。

以上となります。
しっかりと挙動を理解して使っていきたいです。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?