100名以上のプログラミング学習のメンターの経験から、最初につまづく箇所ナンバーワンが「戻り値」「返り値」の概念と感じます。
本記事では特に Ruby におけるメソッドの戻り値について解説します。
メソッドの戻り値(返り値)とは
メソッドの戻り値とは端的に言うと、「メソッドの呼び出し元に戻す(返す)値」です。
「返り値」とも呼ばれます。
文法
戻り値の文法は return というキーワードを使って
return 値
のように書きます。
例えば、渡された数字を2倍して戻すメソッドは
def twice(number)
return number * 2
end
と書けます。
return の省略
Ruby では更にややこしいことに return が省略できるパターンがあります。
Ruby では「最後の実行結果が戻り値となる」というルールがあります。
例えば先程のメソッドは、number * 2 が最後の実行ですので単に return を省略して
def twice(number)
number * 2
end
と書くこともできます。
つまづきポイント
「戻り値」の概念は以上です。
ここまで読んで「わかった!」という方は以降を読む必要はありません。
逆に「よくわからない」と思った方向けに、「戻り値」のポイントを分解して解説します。
たくさんの初学者の方のメンターを務めてきましたが、つまづくポイントにはパターンがあります。
まとめると戻り値についてのポイントは
- 「メソッドの戻り値」とは、「メソッドの呼び出し元に戻す値」である
- 「最後の実行結果」が「戻り値」となる
ですが、このままでわからない場合は上記内容を分解して理解することが大切です。
分解してみると
- 「メソッドの呼び出し」とは
- 「値」とは
- 「メソッドの最後の実行結果」とは
となります。
これらが分かれば全体がわかります。
一つづつ見ていきましょう。
「メソッドの呼び出し」とは
メソッドは「定義」と「呼び出し」に分かれます。
定義は Ruby では
def メソッド名(引数1, 引数2, ...)
# ...
end
のように def … end で記述します。
「メソッド呼び出し」は定義したメソッドを利用することです。
先述した twice メソッド
def twice(number)
number * 2
end
もメソッド定義です。
メソッドは定義しただけでは何も起きません。
定義したメソッドは「呼び出す」ことで実行することができます。
定義した twice メソッドを呼び出す場合は
twice(3) # twice メソッドを呼び出す
のように呼び出します。
「値」とは
「値」は「計算できるところまで計算した式」のことです。
どういうことかというと、例えば
1 + 2
は値ではありません。
1 + 2 はまだ計算できて、計算すると 3 になります。
3 はこれ以上計算しようがないので値です。
数式なら分かりやすいのですが、プログラミング言語の場合は他にも様々な式があります。
例えば変数はそのままでは値とならず、計算結果はその変数の中身ということになっています。
number = 100
number
と記述すると2行目の number は変数なので、計算すると number に入っている 100 となります。
また、メソッド呼び出しは「戻り値」が計算結果ということになっています。
def twice(number)
number * 2
end
twice(3)
の場合、5行目の twice(3) はメソッド呼び出しなのでまだ計算ができて、計算結果は twice(3) の戻り値(= 3 を 2倍する) で 6 となります。
6 はもう計算しきっているので値です。
このように、まだ計算できるかどうか、という観点で考えると把握しやすいでしょう。
「メソッドの最後の実行結果」とは
メソッドの最後の実行結果とは、メソッドを実行していって最後に実行された式の結果(値)です。
例えば
def twice(number)
number * 2
end
twice(3)
の場合は最後に実行した式は number * 2 となります。
メソッド呼び出し twice(3) では 3 を渡していますので、number には 3 が入り、2行目の実行結果は 3 * 2 で 6 となります。
6が最後の実行結果なので twice(3) の戻り値は 6 となります。
よくある勘違いが

最後の行が最後の実行結果なの?
というものです。
プログラムは上から下へ順番に実行されるので、最後の行が最後の実行となることは多いです。
しかし、そうではないことも多いです。
例えば条件分岐などが発生すると状況は変わってきます。
def even?(number) # 引数に渡された値が偶数なら true, 奇数なら false を戻すメソッド
if number % 2 == 0 # 2 で割った余りが 0(つまり偶数)の場合
true
else # それ以外(つまり奇数)の場合
false
end
end
even?(1)
9行目のメソッド呼び出し even?(1) では2行目のnumberに1が入っているのでelse節を実行し、5行目 false が実行されます。
false は値であり、それ以降なにも実行するものが無いので false が even?(1) の最後の実行結果は 5 行目の実行結果である false となります。
5行目は最後の行ではありませんが、「最後の実行」は5行目ということになります。
このように「最後の実行」≠「最後の行」ではないことに注意しましょう。
戻り値の使い方
戻り値が理解できたら、その使い方を理解する必要があります。
ここでは
- 戻り値を変数に代入する
- 別のメソッドの引数に与える
というパターンを見ていきます。
戻り値を変数に代入する
呼び出し元に戻ってきた値は変数に入れるなどしておかないと捨てられてしまいます。
たとえば
def twice(number)
number * 2
end
answer = twice(3) # twice(3) を実行し、戻り値を変数 answer に代入
5 行目では
- twice(3) を実行
- 6 が戻ってくる
- 戻り値 6 を変数 answer に代入
のように動作します。
別のメソッドの引数に渡す
メソッド呼び出しの戻り値を、さらに別のメソッド呼び出しに渡すことができます
例えば
def twice(number)
number * 2
end
# twice(3) の戻り値をさらに twice メソッドに渡して呼び出す。
# さらにその戻り値を puts メソッドに渡して呼び出す
puts twice(twice(3))
7行目では、以下の順番で実行が進みます。
- puts twice(twice(3)) の twice(3) の部分を実行
- twice(3) に 6 が戻ってきて puts twice(6) になる
- puts twice(6) の twice(6) の部分を実行
- twice(6) に 12 がもどってきて puts 12 になる
- puts 12 を実行→ターミナルに 12 が表示される
式の計算だけで見れば
puts twice(twice(3)) → puts twice(6) → puts 12
となります。
まとめ
「戻り値」はとっつきにくいところがあるかもしれませんがプログラミングにとって必須の知識です。
難しい場合は概念を分解してそれぞれを理解した後にもう一度トライしてみてください。