2017-03-24 11 views
1

私はthisの一般的な知識を持っていました。これは演算子優先順位表です。シフト演算子は、論理演算子(& & ||)よりも優先順位が高くなります。私はarrは、アレイとパーティがnilであった。このような状況を、持っていた:シフト演算子でルビ演算子の優先順位問題

arr << party && party[3] 

私はこれをしたとき、最初は、私は党が党よりも皆無だった場合、[]が呼び出されることはありませんだろうと思いました。 < <が優先順位が高いので、もちろん、それは最初にこれをしようとします:

arr << party 

しかし、何次に何が起こりますか?ルビーは、これを行うん:私はこの問題を解決するために)最高演算子を(使用

arr << party[3] 

注:アレイ上

arr << (party && party[3]) 
+1

通訳者やコンパイラがあなたの表現を理解できないと思われるときには常に括弧を使って優先するのが良い。言語(Rubyのような)はそれらをオプションにするかもしれませんが、それらを使用しないと奇妙な/予期しない振る舞いを引き起こす可能性があります。 –

答えて

3

<<オペレータは、配列を返します。したがって、partyがnilの場合、は、arrにプッシュされ、party[3]はブール式の一部として評価されます(表現の左部分が真実であり、短絡していないため)。 partyはゼロであるため、ここでエラーが発生します。

実際には、<<オペレータは、<< Arrayクラスのメソッドに解決されます。これはpushのようなものです。しかし、それは演算子である、異なる優先順位を持って、はい。メソッドを使用する場合は、期待どおりに動作します。

arr.push party && party[3] # => [nil] 
arr.<< party && party[3] # => [nil] 

私は疑問の影があるところであればどこでもかっこを入れます。

arr.push(party && party[3]) 

また、意図はわかりませんが、コードにバグがある可能性があります。上記の行は常に何かarrを押します。 false,nilおよびparty[3]のいずれかです。偽の値で何もしたくない場合は、このようなことをするのが良いでしょう。

arr << party[3] if party 
+2

良い答え。個人的には、私はシャベル演算子がより直感的だと思うし、代わりの構文を使用してここでそれを使用するとうまくいくと思う: 'arr << party [3] if party'。 – moveson

+2

"疑問の影があるところではどこでもカッコを入れています。"同上。彼らは何も費用がかからず、頭が激しくなります。 –

関連する問題