41
32

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Rubyで返り値無しのメソッドはどう書くのが良いのか調べた(が結論は出なかった)

Posted at

自分を含めRubyに不慣れなひと数人でRubyで書かれたコードのレビューをしていたときに、「rubyって最終行の評価結果が返り値になるから、返り値不要のメソッドの場合、どう書くのが良いのか知りたさある」という発言が出たのが発端となり、ググって分かる程度のことをまとめた。

#空のreturnを書く派閥
##【return絶対書くよ派】

  • 返り値不要なら、空のreturnを明示する
  • ”最後に評価された値を返す”という言語仕様が気持ち悪いので、そもそも全てのメソッドでreturnを書く

##【空のreturnだけ書くよ派】

  • 返り値不要なら、空のreturnを明示する
  • ”最後に評価された値を返す”という言語仕様なので、返り値がある場合はそれに従って値を返す

#return書かない派閥
##【return書くとちょっと遅いよ派(旧世代のパフォーマンス重視派)】

##【返り値があってもメソッドを呼ぶ側で扱わないから問題ない派】

  • 「最後に評価された値が返ってしまうことで困ったことはない」
  • 「なんか普通に何が返るべきかーって考えてコードかけば困らなそう、呼び出すところでもこういう値が返ってくるだろうなって期待するところでは返り値を変数にいれるなりするだろうしそうでなければ呼ぶだけだよね」
  • 上記どちらも友人S氏の発言。

##【return絶対要らない派】

  • 「Ruby ではメソッドの最後の return は使っても使わなくても全く同じ 意味に書ける。よってこれは全部省略する。理由は、まず簡潔さ。それから「Ruby ではすべての式が値を持つ」と いう基本思想を適切に表現するからである。if も while もイテレータ もメソッドも同様に値を持つ。ならば書式も全部同じにするのが適切で ある。あらゆる式の記述の中にオブジェクトの流れを見るのだ」
  • 引用元:http://i.loveruby.net/ja/ruby/codingstyle.html

#その他の派閥
##【コーディングルール決めてね派】

  • どう書くか迷うものがあれば、コーディングルールを決めて統一するべき
  • RubyのコーディングルールといえばCookpad社のそれだが、返り値無しのメソッドについての言及は見つからなかった
  • https://github.com/cookpad/styleguide/blob/master/ruby.ja.md
  • (ほかのRubyコーディングルールは調べていない)

#所感
メソッドの返り値の型を指定するJavaやScalaからRubyに移った人や、return必須なPythonなどからRubyに移った人だと、メソッドがなにを返すのか自分の手で明示するのが当然という考えのため、「返り値不要のメソッドの場合、どう書くのが良いのか知りたさある」という気持ちになると思われる。

しかしながらRuby(や同様の言語仕様なPerl)に熟達した人だと、実際にそのメソッドがなんらかの返り値を返していたとしても、返り値不要のメソッドなら呼ぶだけなのだから問題ないという考えに至ると思われる。

余談ですが、
「(Pythonに慣れているせいで)retrun必須なほうが気持ちいいです...」
と言ったところ、Rubyistの友人から
「まだRuby脳になりきれていないようだな」
と返されました。その通りだと思うのでRubyはRubyらしく書けるように精進したいです。

41
32
6

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
41
32

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?