更新日:
【Ruby】 返り値(戻り値)とは?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を使って返り値を指定することができます。
1
2
3
4
5
6
def メソッド名
return 式 #呼び出し元に返す
end
#呼び出し元
メソッド名
また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で終わります。
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を省略する場合
Rubyのメソッドは最後に評価された式の値が返り値になるので、場合によってはreturnを省略することができます。
1
2
3
def メソッド名
式
end
例えばnum * 2
の値をcalc_doubleメソッドの返り値にする場合は、次のようにnum * 2
をメソッド内の最後に記述します。
1
2
3
4
5
6
7
8
9
10
#メソッド定義
def calc_double(num)
p '倍返しだ'
num * 2 #最後に記述される式の値が返り値になる
end
#呼び出し元
calc_double(4)
"倍返しだ"
=> 8
このようにreturnを省略する場合は、返り値にする式をメソッド内の最後に記述します。
returnの式を省略した場合
returnの式を省略した場合は、nil
が返り値になります。
1
2
3
4
5
6
7
8
def メソッド名
return 式
end
#式を省略した場合
def メソッド名
return
end
次のようにメソッドにreturn
のみ記述してメソッドを実行すると、nil
が返ります。
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の後に式を,
で区切り指定します。
1
2
3
4
5
6
7
8
def メソッド名
return 式
end
#式を2つ以上与えた場合
def メソッド名
return 式, 式
end
例えば次のようにreturn 1,2,3
とした場合は、[1, 2, 3]
が返り値になります。
1
2
3
4
5
6
def sample
return 1, 2, 3
end
sample
=> [1, 2, 3]
また次のように計算式を,
で区切り指定すると、返り値は「式の値を要素とした配列」が返ります。
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]
いろんなパターン(応用)
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?
メソッドは、成年年齢か判定するメソッドです。
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の場合のみ「おめでとうございます、スコアは満点です!!」が返ります。それ以外は点数を返します。
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を渡しても、点数が返ってきます。
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が実行されると返り値を返して、メソッドの処理は終了する
