web-dev-qa-db-ja.com

Rubyのリターンポイントは何ですか?

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
76
thenengah

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を返します。 returndid n'tがすぐに中止されると、nil.split(/\s+/)[-1]を実行しようとしてエラーがスローされます。

112

Rubyは最後に評価された式を自動的に返すため、メソッドで実行される最後の行である場合、 "return"を使用する必要はありません。

最終的な「ムード」も必要なく、IFステートメントでそれらの割り当ても必要ありません。

def write_code(number_of_errors)
    if number_of_errors > 1
       "ERROR"
    else
       "No Problem"
    end  
end

puts write_code(10)

出力:

エラー

38
danneu

Rubyは常に戻ります!最善の方法は

def write_code(number_of_errors)
  (number_of_errors > 1)? "ERROR" : "No Problem"
end

これは、number_of_errors> 1の場合、ERRORを返すことを意味します。

4
msroot

リストを調べているときに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の使用を避けることができ、おそらく避けるべきだと思います。

4
philosodad

その素敵なRubyは、returnステートメントを明示的に指定しないというこの優れた機能を提供しますが、プログラミング標準として、必要な場合は常に "return"ステートメントを指定するよう努力する必要があります。 C++、Java、PHPなど)などのさまざまなバックグラウンドから来ている人にとって読みやすい。「return」ステートメントは何も害を与えないので、従来のより標準的なリターン方法をスキップする理由機能から。

3
Kush

他の言語から来た人への一つの小さな注意。 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
0
Tom Hundt