オブジェクト指向言語Rubyで新しいメソッドを作った際、returnでその戻り値を指定します。他のプログラミング言語を習った方ならreturnの使い方を知っているかもしれません。しかしRubyのreturnは省略可能だったり、複数の戻り値を指定できるなど、Ruby独特の使い方が可能です。
今回はRubyでメソッドの戻り値の指定に使用するreturnの使い方について解説します。
メソッドの戻り値とは
Rubyのプログラムは、オブジェクトである変数とそれを扱うメソッドで構成されています。そして、標準でも多くのメソッドがあり、それだけでもプログラムが組めますが、他のプログラミング言語の関数のように新しいメソッドを作ることも可能です。
もし独自のメソッドを作った際、そのメソッドの実行結果を変数などにして、元のプログラムに戻すのが一般的です。Rubyの場合はメソッドの戻り値がこれにあたります。
次からRubyにおける戻り値の特徴を紹介します。
戻り値とは
戻り値とはプログラムから関数やメソッドを呼び出した際に受け取る値のことです。C言語のような手続きを記述するプログラム言語では、「変数 = 関数名」と記述しますが、=を介して変数に入る値が関数の戻り値です。
Rubyにおけるメソッドの戻り値も使い方は同じです。例えば次のようなプログラムを実行した場合、変数valにはMathモジュールにあるsinメソッドの戻り値が代入されます。
val = Math.sin(Math::PI/2)
戻り値の書き方
多くのプログラムに影響を与えたC言語では、関数の戻り値をreturnで指定していました。今使われている多くのプログラミング言語がC言語の影響を受けていることもあり、多くのプログラミング言語の戻り値にreturnが使われます。
C言語のreturnと全く同じではありませんが、Rubyでも戻り値の指定にretuenを使用します。
C言語のreturnの例
int calc(int in1) { return( in1 * in1 ); }
上記と同じ機能をRubyで作成した例
def calc(in1) return( in1 * in1 ) end
上記のC言語とRubyのreturnの使い方を見比べてもらえれば解るように、Rubyのreturnは他のプログラム言語と同じように使えます。
Rubyの戻り値はオブジェクト
先ほど紹介したようにRubyのreturnは他のプログラム言語と同じように使えますが、その機能は違います。例えばRubyのプログラムでは全ての要素をオブジェクトとして扱うことから、returnの戻り値もオブジェクトです。そのため戻り値として複数の値を指定することも可能です。
もちろん戻り値に配列やハッシュを1つだけ指定できます。Rubyのretuenでは数字や文字列などの戻り値を複数指定し、それを配列として受けるといったことも可能です。
returnで複数の戻り値を指定した例
def res() a = 2 b = 'test' c = true return a, b, c end out = res p out # "[2, "test", true]"を表示する
Rubyではreturnを省略できる
Rubyではメソッドの最後に記述した式が戻り値になります。そのため、returnを省略した書き方が可能です。例えば、先ほどの例は次のように書き換えられます。
returnを省略したメソッドの例
def calc(in1) in1 * in1 end
retuenの文法
returnの機能は、引数で指定した式の値をメソッドの戻り値として返し、メソッドを終了させるの2つです。そして引数に複数の値を指定した場合は、戻り値を配列にして返します。またreturnで引数を省略した場合はnilを返します。
returnの文法
return [式 [, 式 …. ] ]
retuenの使用例
先ほどC言語のreturnの使い方を比較してRubyのreturnについて紹介しましたが、単純にreturnだけ使われるケースは多くありません。実際のプログラムではif構文の中で使われたり、returnを省略する書き方もよく使われます。
次から実際のプログラムで使われることの多いreturnの使用例を紹介します。
if構文に組み合わせる
先ほど説明したようにreturnの機能は、戻り値を返す機能とメソッドを終了させる機能の2つです。そしてメソッドを終了させる機能を利用すれば、ifとelseで別の戻り値を返すプログラムを作れます。
例えば引数を評価して3つの戻り値のどれかを返すメソッドを作る場合、下記のようにif構文による条件毎にreturnを使って記述が可能です。
if構文とreturnの組み合わせの例
if 条件1 then return 戻り値1 else if 条件2 then return 戻り値2 else return 戻り値4 end
複数の戻り値を返す
先ほど紹介したようにRubyのreturnは複数の戻り値を指定できます。そして複数の戻り値を配列で受け取りますが、Rubyのプログラムの書き方によっては複数の戻り値を複数の変数で受ける書き方も可能です。
例えば下記のように3つの変数を作るメソッドがあったとします。returnで3つの変数を戻り値に指定することで、配列として受け取れます。
複数の戻り値を返すメソッドの例
def res() a = 2 b = 'test' c = true return a, b, c end out = res p out # "[2, "test", true]"を表示する
上記のメソッドを配列ではなく変数として受ける書き方も可能です。
複数の戻り値を受けるプログラムの例
def res() a = 2 b = 'test' c = true return a, b, c end v1, v2, v3 = res p v1 # 2を表示する p v2 # "test"を表示する p v3 # trueを表示する
変数と配列の組み合わせで受け取る
先ほどRubyのreturnで複数の文字列を指定した場合、配列または複数の変数で受け取れると説明しましたが、変数と配列の組み合わせで受け取ることも可能です。
例えば、4つの値を返すメソッドを作成し、最初の戻り値を変数に、残りを配列で受け取る処理を作る場合、次のように書くことが可能です。この場合、配列で受け取る変数に「*」を付けて指定します。下記に変数numと配列arrで戻り値を受け取るRubyのプログラムの例を紹介します。
戻り値で変数と配列で受け取る例
def res() a = 10 b1 = 1 b2 = 'test' b3 = true return a, b1, b2, b3 end num, *arr = res p num # 10を p arr # [1, "test", true]を表示する。
なお戻り値の組み合わせで「*arr, num」と指定することも可能です。ただし「*arr1, *arr2」という組み合わせはできないので注意してください。
Rubyの戻り値を省略した場合の注意点
Rubyではメソッドの戻り値を指定する際にreturnを省略した書き方が可能です。そして多くのケースでreturnをそのまま省略しても期待通りに動作します。
例えば、下記のようなif構文を使ったメソッドは、そのままreturnを省略できます。
returnを使ったメソッドの例
def check_false1(flg) if flg return "OK" else return "NG" end end
returnを省略したメソッドの例
def check_false1(flg) if flg "OK" else "NG" end end
しかしそのままreturnを省略できないケースもあります。例えばif演算子を使ったケースです。returnを省略してリファクタリングする場合は十分注意してください。
if演算子を使ったメソッドの例
def check_false2(flg) return "OK" if flg return "NG" end
上記の例でreturnを省略すると、flgがtrueでメソッドが終了する、というreturnの機能が無くなるので、最後に評価した結果が”NG”となり、実行結果が必ずNGになります。このようにreturnには戻り値を指定する機能とメソッドを終了させる機能の2つがあることを理解して使ってください。
まとめ
これまで紹介したようにreturnの機能は、メソッドの戻り値を指定する機能とメソッドを終了させる機能の2つです。そのためメソッドの最後かif構文の中で使用します。さらにRubyのreturnに複数の戻り値を指定することが可能で、その場合戻り値を配列として受け取れます。
なおメソッドの戻り値は、returnを省略することが可能ですが、returnを使った場合と全く同じではないので注意してください。