return
と次のような変数を置くだけの違いは何ですか:
def write_code(number_of_errors)
if number_of_errors > 1
mood = "Ask me later"
else
mood = "No Problem"
end
mood
end
def write_code(number_of_errors)
if number_of_errors > 1
mood = "Ask me later"
else
mood = puts "No Problem"
end
return mood
end
return
を使用すると、早期に脱出できます。
_def write_code(number_of_errors)
return "No problem" if number_of_errors == 0
badness = compute_badness(number_of_errors)
"WHAT?! Badness = #{badness}."
end
_
_number_of_errors == 0
_の場合、_"No problem"
_がすぐに返されます。ただし、メソッドの最後に、あなたが観察したように、それは不要です。
編集:return
がすぐに終了することを示すために、次の関数を検討してください。
_def last_name(name)
return nil unless name
name.split(/\s+/)[-1]
end
_
この関数をlast_name("Antal S-Z")
として呼び出すと、_"S-Z"
_が返されます。 last_name(nil)
として呼び出すと、nil
を返します。 return
did n'tがすぐに中止されると、nil.split(/\s+/)[-1]
を実行しようとしてエラーがスローされます。
Rubyは最後に評価された式を自動的に返すため、メソッドで実行される最後の行である場合、 "return"を使用する必要はありません。
最終的な「ムード」も必要なく、IFステートメントでそれらの割り当ても必要ありません。
def write_code(number_of_errors)
if number_of_errors > 1
"ERROR"
else
"No Problem"
end
end
puts write_code(10)
出力:
エラー
Rubyは常に戻ります!最善の方法は
def write_code(number_of_errors)
(number_of_errors > 1)? "ERROR" : "No Problem"
end
これは、number_of_errors> 1の場合、ERRORを返すことを意味します。
リストを調べているときにreturnを使用し、リストのメンバーが条件を満たした場合に関数を終了します。次のような単一のステートメントでこれを達成できます。
_list.select{|k| k.meets_criteria}.length == 0
_
状況によっては、しかし
_list.each{|k| return false if k.meets_criteria}
_
私の考えでは、柔軟性がいくらか追加されています。たとえば、最初の例では、これがメソッド内の唯一の行であり、何があってもこのポイントから戻りたいと想定しています。ただし、これがメソッドの残りの部分を続行しても安全かどうかを確認するテストである場合、最初の例では別の方法で処理する必要があります。
編集:
柔軟性を追加するには、次のコード行を検討してください。
list_of_method_names_as_symbols.each{|k| list_of_objects.each{|j| return k if j.send(k)}}
これはreturn
なしで1行で達成できると確信していますが、頭の外ではその方法がわかりません。
しかし、これは、ブールメソッドの任意のリストとそれらのメソッドを実装するオブジェクトのリストで呼び出すことができる、かなり柔軟なコード行になりました。
[〜#〜] edit [〜#〜]
この行はブロックではなくメソッド内にあると仮定していることに注意してください。
しかし、これは主に文体的な選択です。ほとんどの状況で、return
の使用を避けることができ、おそらく避けるべきだと思います。
その素敵なRubyは、returnステートメントを明示的に指定しないというこの優れた機能を提供しますが、プログラミング標準として、必要な場合は常に "return"ステートメントを指定するよう努力する必要があります。 C++、Java、PHPなど)などのさまざまなバックグラウンドから来ている人にとって読みやすい。「return」ステートメントは何も害を与えないので、従来のより標準的なリターン方法をスキップする理由機能から。
他の言語から来た人への一つの小さな注意。 OPのような関数があり、「最後に計算された」ルールを使用して、戻り値を自動的に設定するとします。
def write_code(number_of_errors)
if number_of_errors > 1
mood = "Ask me later"
else
mood = "No Problem"
end
end
そして、デバッグ(またはロギング)ステートメントを追加するとしましょう:
def write_code(number_of_errors)
if number_of_errors > 1
mood = "Ask me later"
else
mood = "No Problem"
end
puts "### mood = #{mood}"
end
今何を推測します。 puts
がnilを返すため、コードが壊れています。nilは関数からの戻り値になります。
解決策は、OPが行ったように、常に明示的に戻り値を最後の行に置く習慣をつけることです。
def write_code(number_of_errors)
if number_of_errors > 1
mood = "Ask me later"
else
mood = "No Problem"
end
puts "### mood = #{mood}"
mood
end