2016-05-20 9 views
-1

any?ステートメントのandを置き換えると、エラーunexpected tIDENTIFIER, expecting '}'がスローされます。ブロック内のRuby `&&` vs `and`

def ArrayAddition(arr) 
    i = 2 
    until i == arr.length 
    combinations = arr.permutation(i).to_a 
    return true if combinations.any?{|array| array.inject(&:+) == arr.max and !array.include? arr.max} 
    i+=1 
    end 
    false 
end 

ここでは何が起こっていますか? Rubyはこれらの演算子を別々に扱いますか?

答えて

3

はい。 andは、&&(およびalmost everything else)より低い優先順位を持ちます。この式:

foo and bar baz 

が...このように解析されます。

foo and (bar baz) 

... Rubyが(それが何かすることはできませんので)メソッド名であるfooを知っているので。一方、この式:

foo && bar baz 

が...このように解析されます。

(foo && bar) baz 

...ただ意味をなすとあなたは構文エラーを取得しません。

は、一般的に、あなたが、具体的andの低い優先順位を希望しない限り、構文エラーに最も簡単な修正プログラムは、メソッドの引数を囲む括弧を使用することで、この場合のように、あなたは、&&を使用する必要があります話す:

foo && bar(baz) 

を...それで:

array.inject(&:+) == arr.max && !array.include?(arr.max) 

ボーナスとして、これもまた読みやすくなります。

+3

親愛なるdownvoter:あなたのdownvoteの理由を説明してください。私の答えに問題がある場合は、改善する機会に感謝します。 –

+0

@MichaelGaskill多くのことを感謝します! –

+0

@ジョーダン、誰かが今日気分が悪い) – Ilya

3

演算子and&&は、異なる優先順位を持ち、同等ではありません。このように、Ruby Style Guideandor演算子使用に対して忠告:により優先順位の差The and and or keywords are banned. It's just not worth it. Always use && and || instead.

を、式中の他の事業者は、より高いまたはより低い比較の優先順位を持っています。この場合、Array#include?呼び出しの引数は、間違った式にバインドされます。

これは、Array#include?コールの引数の前後にかっこを追加することで解決できます。

+1

答えに建設的な何かがあるなら、コメントしてください。任意の匿名ダウンボートは、回答の質を改善するために何もしません。 –

+2

私は今夜(私は推測している...)、そしてスタイルガイドのリンクのために自分自身を賭けることを決めたトロールに対抗するためにアップアップされました。 –

+0

ありがとう、ジョーダン - 私はそれが誰かも知りません。私は確かに答えを改善する建設的なフィードバックを好むだろう。しかし、私は答えをダウンダウンして移動するほうが簡単だ(そしておそらくもっと満足している)と思います... –