+、::、->などの通常の演算子はすべてオーバーロードできるメソッドなので、||および&&もメソッドです。これがブール型オブジェクトのメソッドである場合、これは理論的には機能します。しかし、そうであれば、なぜ
if (foo == bar && buz == fol)
可能?コンパイラが右から左に読み取る場合、これは(foo == bar)の代わりにbarで&&を呼び出します。
6.12.3中置演算子中置演算子は任意の識別子にすることができます。中置演算子には、次のように定義された優先順位と結合規則があります。
中置演算子の優先順位は、演算子の最初の文字によって決まります。以下に、文字を優先順位の高い順にリストします。同じ行の文字は同じ優先順位になります。
つまり、文字で始まる演算子の優先順位が最も低く、次に「|」で始まる演算子が続きます。
このルールには、代入演算子に関する例外が1つあります(§6.12.4)。代入演算子の優先順位は、単純代入(=)の優先順位と同じです。つまり、他の演算子の優先順位よりも低くなります。
次に、結合性の説明と、それがすべての式で複数の演算子とどのように組み合わされるかについて説明します。 Scalaリファレンス は読みやすくなります。
メソッドが=で始まるのは、メソッドが& で始まるよりも優先順位が高いためです。
したがって(foo == bar && buz == fol)は次のようになります。
val tmp1: Boolean = (foo == bar)
val tmp2: Boolean = (buz == fol)
tmp1 && tmp2
これら2つは間違いなくscalaのメソッドです。