1. ホーム
  2. ruby

[解決済み] Rubyで明示的にreturnするのは良いスタイルか?

2022-04-24 11:28:14

質問

Pythonのバックグラウンドを持つ私は、スタイルに関して常に正しい方法(Pythonicな方法)が存在するのですが、Rubyにも同じことが存在するのか疑問に思っています。私はこれまで独自のスタイルガイドラインを使用してきましたが、ソースコードを公開しようと考えており、存在するかもしれない不文律を遵守してもらいたいと考えています。

を明示的にタイプアウトするのはRuby Wayなのでしょうか? return メソッドの中で?あるともないとも言われていますが、正しいやり方はあるのでしょうか?もしかしたら、正しい 時間 を行うことができますか?例えば、こんな感じです。

def some_func(arg1, arg2, etc)
  # Do some stuff...
  return value # <-- Is the 'return' needed here?
end

解決方法は?

古い(そしてquot;answered")質問ですが、私の2セントを答えとして投げます。

TL;DR - そうする必要はありませんが、場合によってはコードをより明確にすることができます。

明示的な return を使わないのは Ruby 流かもしれませんが、慣れないコードを扱うプログラマや、Ruby のこの機能に馴染みのないプログラマにとっては、混乱を招くことになります。

やや不自然な例ですが、このような小さな関数があり、渡された数字に1を足してインスタンス変数に代入しているとします。

def plus_one_to_y(x)
    @y = x + 1
end

これは、値を返す関数という意味だったのか、そうでなかったのか? インスタンス変数を代入し、代入された値も返しているので、開発者が何を言いたかったのかがわかりません。

ずっと後になって、別のプログラマ(おそらくRubyが最後に実行されたコードに基づいてリターンを行う方法にあまり慣れていない)がやってきて、ロギングのためにいくつかのprint文を入れたいと思い、この関数がこうなったとします...。

def plus_one_to_y(x)
    @y = x + 1
    puts "In plus_one_to_y"
end

今度は関数が壊れました 返り値を期待するものがあれば . 何も戻り値を期待しないのであれば、それは問題ありません。 明らかに、コード・チェーンのさらに下のどこかで、これを呼び出す何かが返り値を期待している場合、期待するものが返ってこないので失敗することになります。

今、真に問われているのは、何かが本当に戻り値を期待していたのか、ということです。 これは何かを壊したのか、そうでないのか? 将来的に何かを壊してしまうのでしょうか? それは誰にもわからない。 すべての呼び出しを完全にコードレビューすることでしか、あなたは知ることができません。

ですから、少なくとも私にとってのベストプラクティスは、重要であれば何かを返すことを明確にするか、そうでなければ何も返さないかのどちらかです。

つまり、今回の小さなデモ関数の場合、値を返すと仮定すると、次のように記述することになります。

def plus_one_to_y(x)
    @y = x + 1
    puts "In plus_one_to_y"
    return @y
end

そうすれば、プログラマーにとって、それが値を返すものであることが非常に明確になり、気づかずに壊してしまうことも難しくなります。

あるいは、こんな風に書いて、return文を省くこともできる...。

def plus_one_to_y(x)
    @y = x + 1
    puts "In plus_one_to_y"
    @y
end

しかし、なぜわざわざreturnという単語を省くのでしょうか? なぜreturnを入れずに、何が起こっているのか100%明らかにしないのでしょうか? それは、文字通り、あなたのコードの性能に何の影響も及ぼさないでしょう。