すでにメンバーの場合は

無料会員登録

GitHubアカウントで登録 Pikawakaが許可なくTwitterやFacebookに投稿することはありません。

登録がまだの方はこちらから

Pikawakaにログイン

GitHubアカウントでログイン Pikawakaが許可なくTwitterやFacebookに投稿することはありません。

Ruby

【Ruby】 返り値(戻り値)とは?returnの使い方を初心者向けに解説

ぴっかちゃん
ぴっかちゃん

返り値(戻り値)とは、呼び出されたメソッドの処理を終了する際に呼び出し元に返す値のことです。

return文の後に記述される式の値を返り値として「呼び出し元」へ返されます。

returnの文法
1
2
3
4
5
6
def メソッド名
return #呼び出し元に返す
end #呼び出し元 メソッド名

具体的には次のように呼び出し元に値が返ります。

メソッド実行から返り値までの流れ
1
2
3
4
5
6
7
8
#メソッド定義
def calc_double(num) #②numには4が渡される
return num * 2 #③「4*2」の値を呼び出し元に返す
end #呼び出し元
calc_double(4) #①calc_doubleメソッドの引数に4を渡して実行する
=> 8 #④returnで指定した式の値が返る

この記事では「返り値とは何か」「return文の使い方」を初心者向けに画像や豊富なサンプルコードで解説します。開発現場で役立つ内容もあるので、ぜひ読んでみてください。

メソッドや引数については「メソッドの使い方」を参考にしてください。

返り値(戻り値)とは

冒頭でも説明した通り「返り値とは、メソッドの処理を終了する際に呼び出し元に返す値のこと」です。

返り値の流れ

次のようにcalc_doubleメソッドを実行すると、return文の後に記述される式の値(8)が返り値として呼び出し元に返ります。

返り値の具体例

Rubyの返り値にはさまざまなルールがあります。次のreturnの文法で確認していきます。

ポイント

返り値とは、メソッドの呼び出し元に返す値のこと

returnの文法(基礎)

Rubyでは、returnを使って返り値を指定することができます。

returnの文法
1
2
3
4
5
6
def メソッド名
return #呼び出し元に返す
end #呼び出し元 メソッド名

またreturnは返り値を指定するだけではなく、メソッドの処理を終了させることもできます。他にもreturnは省略可能です。

returnの機能や特徴について詳しく解説します。

returnの機能とは

returnは、指定した式の値を返り値として「呼び出し元」へ返すだけではなく、returnの実行時点でメソッドの処理を終了する機能があります。

次の具体例で確認してみましょう。
return前に他の処理がある場合は、メソッドの返り値の前に処理が実行されます。

return前に他の処理がある場合
1
2
3
4
5
6
7
8
9
10
#メソッド定義
def calc_double(num)
p '倍返しだ' # return前に追加
return num * 2 end #呼び出し元 calc_double(4)
"倍返しだ" #return前の処理は実行される
=> 8

しかし、次のようにreturn以降に他の処理を追加した場合は、メソッドの処理はreturnで終わります。

return以降に他の処理がある場合
1
2
3
4
5
6
7
8
9
10
#メソッド定義
def calc_double(num)
  return num * 2
p '倍返しだ' #return後に追加
end #呼び出し元 calc_double(4) => 8
#return後の処理は実行されない

このようにreturnが実行されると、指定した式の値を返り値として返し、メソッドの処理を終了させます。returnの後に続く式があってもメソッドの処理はreturnで終わります。

ポイント

returnには、「指定した式の値を返り値として返す」と「メソッドの処理を終了させる」という2つの機能がある

つまりメソッドの処理を終了させるタイミングをreturnで指定することができる

returnを省略する場合

Rubyのメソッドは最後に評価された式の値が返り値になるので、場合によってはreturnを省略することができます。

returnの文法
1
2
3
def メソッド名
end

例えばnum * 2の値をcalc_doubleメソッドの返り値にする場合は、次のようにnum * 2をメソッド内の最後に記述します。

returnを省略した場合
1
2
3
4
5
6
7
8
9
10
#メソッド定義
def calc_double(num) 
  p '倍返しだ'
num * 2 #最後に記述される式の値が返り値になる
end #呼び出し元 calc_double(4) "倍返しだ"
=> 8

このようにreturnを省略する場合は、返り値にする式をメソッド内の最後に記述します。

ポイント

Rubyの「最後に評価された式の値が返り値になる」という仕様を利用することで、returnを省略することができる

returnの式を省略した場合

returnの式を省略した場合は、nilが返り値になります。

returnの文法
1
2
3
4
5
6
7
8
def メソッド名
return
end #式を省略した場合 def メソッド名
return
end

次のようにメソッドにreturnのみ記述してメソッドを実行すると、nilが返ります。

returnの式を省略した場合
1
2
3
4
5
6
7
8
9
#メソッド定義
def calc_double(num)
  num * 2
return
end #呼び出し元 calc_double(4)
=> nil

returnに式を2つ以上与えた場合

returnに式を2つ以上与えた場合は、式の値を要素とした配列が返り値になります。
次のようにreturnの後に式を,で区切り指定します。

returnの文法
1
2
3
4
5
6
7
8
def メソッド名
return
end #式を2つ以上与えた場合 def メソッド名
return ,
end

例えば次のようにreturn 1,2,3とした場合は、[1, 2, 3]が返り値になります。

式を2つ以上与えた場合
1
2
3
4
5
6
def sample
return 1, 2, 3
end sample
=> [1, 2, 3]

また次のように計算式を,で区切り指定すると、返り値は「式の値を要素とした配列」が返ります。

式を2つ以上与えた場合
1
2
3
4
5
6
7
8
#メソッド定義
def calc_double(num)
return num * 2, num * 2, num * 2
end #呼び出し元 calc_double(4)
=> [8, 8, 8]
ここまでの重要ポイント
  1. returnは「返り値」と「メソッドの処理を終了するタイミング」を指定できる
  2. Rubyの最後に評価された式の値が返り値になる仕組みを利用してreturnを省略できる
  3. returnの式を省略するとnilが返り値になる

いろんなパターン(応用)

returnや返り値にまつわるテクニック、returnを省略する際の注意点を解説しています。

返り値を変数へ代入する

メソッドの返り値を変数に代入して利用することもできます。

メソッドの返り値を変数に代入する
1
変数 = メソッド名(引数)

次のようにメソッドの返り値をsumに代入して利用できます。

合計を変数に代入して利用する
1
2
3
4
5
6
7
8
#メソッド定義
def add(num1, num2)
  return num1 + num2
end

#呼び出し元
sum = add(100, 250) #=> 350
p "合計は、#{sum}です。" #=> "合計は、350です。"

ガード節を使おう

ガード節とは、処理の対象外とする条件をメソッドやループの先頭に集めてreturnやnext/breakを使用して早めに処理を終了させる方法です。

ガード節を使用すると、深いネストを改善して可読性や保守性が上がります。

次の具体例で確認してみましょう。
is_adult?メソッドは、成年年齢か判定するメソッドです。

is_adult?メソッドを実行
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#メソッド定義
def is_adult?(age)
  if age.nil?
    return false #nilならfalseを返してメソッドの処理を終了させる
  else
if age >= 20 #if文の中に別のif文が記述される(ネスト)
return true else return false end end end #呼び出し元 is_adult?(19) => false

最初のif文でageがnilかチェックします。nilならfelseを返してメソッドを終了、nilでなければネストするif文でageが20以上かで処理を分岐します。

ガード節を使うと次のようにネストを解消することができます。

ガード節を使った場合
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#メソッド定義
def is_adult?(age)
return false if age.nil? #機能しなくなるので、このreturnは省略できない
if age >= 20 #ネストが解消される true #このreturnは省略できる else false #このreturnは省略できる end end #呼び出し元 is_adult?(19) => false

処理の対象外とする条件(ageがnil)を先頭にして、即座にreturnします。
このようにガード節を使うことで、ネストを解消してメインの処理と明確に分けることができます。

returnを省略する場合の注意点

returnを省略する際の注意点は、メソッド内の最後に式が記述されると期待する条件の返り値を得られない場合があることです。

次の具体例で確認してみましょう。
scoreが100の場合のみ「おめでとうございます、スコアは満点です!!」が返ります。それ以外は点数を返します。

mark_testメソッドを実行
1
2
3
4
5
6
7
8
9
10
11
12
13
14
def mark_test(score)
  if score == 100
return 'おめでとうございます、スコアは満点です!!' #scoreが100の場合
end "あなたのスコアは#{score}点です。" #scoreが100ではない場合 end #メソッド呼び出し元 mark_test(100)
=> "おめでとうございます、スコアは満点です!!"
mark_test(90) => "あなたのスコアは90点です。"

上記のメソッドでは、条件式の後に式(あなたのスコアは〇〇点です。)が記述されていますよね。このような場合、if文のreturnを省略してしまうと条件が成立しても最後の式の値が返り値となり、期待する結果を得られなくなります。

次のようにscoreに100を渡しても、点数が返ってきます。

returnを省略した場合
1
2
3
4
5
6
7
8
9
10
def mark_test(score)
  if score == 100
'おめでとうございます、スコアは満点です!!' #returnを省略
end "あなたのスコアは#{score}点です。" #この式の値が返り値になってしまう end mark_test(100)
=> "あなたのスコアは100点です。"

このようにreturnを省略できない場合があるので注意しましょう。

この記事のまとめ

  • 返り値とは、呼び出されたメソッドの処理を終了する際に呼び出し元に返す値のこと
  • returnを使って返り値を指定することができる
  • returnが実行されると返り値を返して、メソッドの処理は終了する