2011-08-03 20 views
0

私はちょうど興味深いコードを見つけました。私はそれがルビーの標準であるかレールの規則であるかを判断したいと思います。RubyまたはROR - '||'で区切られた関数の引数

redirect_to(session[:return_to] || users_path) 

これにより、redirect_to:backがエラーを引き起こすのを防ぐことができます。 C++では、そのようなものは1つのbool引数を持つ関数を意味します。しかし、ここで別の方法で動作するように思われる - それは私が想定していないことではない引数を取る。誰かが私にそれを説明し、引数が '||'で区切られたそのような関数の定義例を表示できますか?

バイ

+0

接線のビットが、私は( 'or'オペレータは、このような状況では、より「正しい」だろうと感じhttp://avdi.org/devblog/2010/08/02/using-and-and-or -in-ruby /)である。質問に答えないが、私はそれをそこに置くと思った。 – Karl

答えて

6

||&&などのブール演算子は、最後に評価された文を返します。

たとえば、puts "hi" && "no"

上記「ノー」の両方の文字列が「truthy」と呼ばれる「ノー」だった最後の値と見なされるので、印刷します。

この場合、プログラマは||演算子の短絡特性を利用しています。だから、別の例として、

puts "hi" || "no"

上記の意志を出力「HI」以来、「HI」truthyとみなされ、または短絡されている「HI」という表現から呼び出すと返される最後の値となりました。

ルビーでは、この種の構造が多く見られます。特に、ifがあります。

a = if true 
    "A will be set to this string" 
else 
    "This will never happen" 
end 

puts a #=> A will be set to this string 

編集:ニックが述べたように、それだけでnilfalseが「falsy」として扱われることに注意することが重要です。 「HI」

a = Object.new || "hi" 
puts a #=> <Object:0x10832420> 
この場合

(とについて評価し、返さ(及びその後に譲渡された)されたように、第1の引数は「falsy」であるこれら2つの場合において

a = nil || "hi" 
puts a #=> "hi" 
a = false || "hi" 
puts a #=> "hi" 

興味深い例最初の引数としての他の値)Object.newは "true"なので、 "hi"は決して評価されません。あなたの特定の例では、作者は存在の有無をテストする可能性が最も高いです(ゼロでない)session[:return_to]です。これは非常に便利ですが、falseが有効な値であれば正しく動作しない可能性があります。

+0

ルビでは、 'nil'と' false'だけがfalseと評価されます。この種の表現は 'try_this ||のために慣用的です。 fall_back_in_case_the_other_was_nil'。 –

+0

合意。私はこれを試して伝えるために拡大しました。 – diedthreetimes

1

論理和は短絡されています。つまり、左側が「真」または非nilの場合、式全体の値は左側になり、右側決して考慮されません。したがって、session[:return_to]がnil以外の場合は、式の値になります。しかし、それがゼロであれば、式の値は右辺の値、すなわちuser_pathの値になります。

x || x = "foo"のように書くこともできます。この場合、xは、最初はnilだった場合にのみ再割り当てされますが、nil以外の場合は触れません。

この関数は、文字列を取るだけで、引数に何を差し込んでも気にしません。 [:return_to]が存在する場合、ない場合は、リダイレクト

3

これはShort-Circuit Evaluationと呼ばれ、それは多くのプログラミング言語に平易な英語で

一般的ですが、あなたの文は

は、「セッションにリダイレクト語りますto users_path "

関連する問題