Search

検索したいワードを入力してください

Rubyでのreturnの書き方と明示的に設定する方法を解説

初回公開日:2019年04月10日

更新日:2019年04月10日

記載されている内容は2019年04月10日時点のものです。現在の情報と異なる可能性がありますので、ご了承ください。

また、記事に記載されている情報は自己責任でご活用いただき、本記事の内容に関する事項については、専門家等に相談するようにしてください。

return文の基本的な使い方やRubyではreturnは省略できるということを解説しています。さらにreturnを省略してはいけない場合や省略せずに書くとよりよいコードになる場合を解説しています。おまけですが、式と文との違いも簡単に解説しています。

returnとは

returnはRubyにおいてメソッドの処理を中断し値を返す文です。メソッドの中でreturnを書くと、以降の処理は行われず、returnに渡した値がメソッドの返り値となります。

本記事では、returnの基本的な使い方や、実はreturnは省略できるという事実、省略して書かない方がいいのはどういう場合なのか、などを解説します。

Rubyでのreturnの基本的な書き方

returnの基本的な使い方と省略する書き方を見ていきます。基本的には省略しても問題ありませんが、後ほど省略してはいけない場合や省略しない方がいい場合を紹介するので、基本的な使い方は覚えておきましょう。

Rubyでreturnを明示的に設定する方法

return文の基本的な書き方を見ていきましょう。基本的にreturnはメソッドの中で用います。次のコードは渡された数値に2を足して返すメソッドです。

def add2(num)
result = num + 2
return result
end

簡単な例ですが、実行してみましょう。

> add2(0)
2
> add2(5)
7

メソッドのように

def add2(num)
result = num + 2
return(result)
end

とかっこを付けて値を渡すこともできますが、あまり一般的ではないので基本的にはスペースを空けて値を渡します。

Rubyではreturnを省略できる

実はRubyではメソッドの最後に評価された値がメソッドの返り値となるので、returnは省略して書くことも可能です。先ほどのadd2メソッドは次のように書いても同じです。

def add2(num)
result = num + 2
result
end

または

def add2(num)
num + 2
end

「評価された値」とは簡単に言えば「実行された結果の値」を意味します。変数が評価されたら変数の中身が返り、メソッドや計算が評価されると、そのメソッドの返り値や計算結果が評価された値となります。

returnは文である

先ほど、returnは「値を返す文」だと書きました。Rubyの命令は大きく分けて「値を返す式」と「値を返さない式」があります。値を返さない式を特に「文」と呼び、whileやreturnなどが文に属しています。

今の段階でreturnが文かどうかはそれほど重要ではありませんが、Rubyをさらに深く理解し、より便利に使っていくためには知っておくといいでしょう。ちなみに、Ruby以外の言語ではifは「if文」と呼ばれるように、値を返さない式に属しているのですが、Rubyではifは式なので、値を返します。


> result = if true
> 3
> else
> 4
> end
> result
3

コード量を減らす際にこのテクニックはよく使います。

returnを使用した方がよい場合

Rubyではほとんどの場面でreturnを明示的に書かなくても済みます。一方で明示的にreturnを書かないといけない場合や、書いた方がいい場合もあるので紹介します。

コーディング規約に省略しないと書いてある

プロジェクトによっては、コーディング規約が用意されてあったり、既存のコーディング規約に沿ってコーディングして下さいと、お願いされる場合があります。もしプロジェクトのコーディング規約に、returnは省略しないと書いてあれば、個人の好き嫌い関係なく、returnは明示的に書かなくてはなりません。

プロジェクトにRubyをメインで扱っていないメンバがいる場合や、開発メンバが多くコードの品質を一定に保ちたい場合などに、returnを明示的に書くコーディング規約が採用されることが多いです。

ある特定の条件の場合に別の値を返したい場合

先ほども書きましたが、ifは式なのでreturnを書かずに、中身がif式だけのメソッドを作ることができます。

def add100(num)
if num < 100
num + 100
else
num
end
end

これぐらいのif式であれば、後述のif式を使った方がコード量を少なく、かつ見やすくなります。

def add100(num)
num + 100 if num < 100
num
end

しかし、実行してみるとnum < 100の場合でも、メソッドの返り値は引数に渡した数がそのまま返ってきます。

> add100(50)
50
> add100(110)
110

これは、メソッドの最後に評価された値がnumだからです。numが100より小さい場合に100を足して返すには、returnで明示的に値を返す必要があります。

def add100(num)
return num + 100 if num < 100
num
end

> add100(50)
150
> add100(110)
>110


このように、後述のif式を使う場合は、セットでreturnを使うと覚えておきましょう。

以降の処理を実行しなくてもいい場合

3つ目は、ループ処理の中でよく使われるreturnです。まずは次のコードを見てください。

def search_item(num)
result = nil
items.each do |item|
result = item if item.number = num
end
result
end

一見よくある感じのコードですが、検索対象がリストのどこにあっても、リストをすべて走査してしまい、非効率です。そこで、明示的にreturnを書き、見つけ次第ループから抜け出すように修正しましょう。

def search_item(num)
items.each do |item|
return item if item.number = num
end
nil
end

最後にnilを書かないと、見つからなかった場合itemsが返り値となってしまいます。以降の処理を実行する必要が無い場合は、早めにreturnで値を返すようにしましょう。

複数の値を返したい場合

4つ目はreturnを使って、複数の値を返す方法を紹介します。あまり利用する場面は多くないですが、一つのメソッドから、複数の値を返すことができると便利な場合があります。returnを使わない場合では、一旦配列にしてから返すという方法があります。

def swap(x, y)
[y, x]
end

> a = 1
> b = 3
> a, b = swap(a, b)
>a
3
> b
1

これをreturnを使って書きます。

def swap(x, y)
return y, x
end

> a, b = swap(a, b)

配列にせずに、カンマ区切りでreturnに渡すことで、複数の値を返すことができます。returnを使った場合でも、swapメソッドは配列を返すようになるので、結果的には使わない場合と同じになるのですが、より直観的に書くことができます。

使いどころをおさえて効率の良いコーディングを

コーディング規約で規定されている場合を除いて必ずしもreturnを書く必要はありません。しかし、使いどころをおさえて適切に使うことで読みやすく、効率的なコードを書けるようになります。

Related