メソッドと括弧の間にスペースがない場合のエラー
概要
以下のエラーの原因は何でしょうか?二人とも2を返してくれることを期待しています。
Ruby スタイル ガイドでは、メソッド名と括弧の間にスペースを入れないことが奨励されており、それに応じて、スペースがある場合、Rubocop は (安全に自動修正可能な) Lint/ParenthesesAsGroupedExpression で警告します。ただし、スタイルガイドに合わせてスペースがない場合は、実際にはエラーが発生します。
Integer.sqrt (4 if true) # 2
Integer.sqrt(4 if true) # syntax error, unexpected `if' modifier, expecting ')'
10年前に同様の問題を調査した関連質問があり、OPで受け入れられなかった最高評価の回答(2票)があり、不明瞭で従うのが難しいと思います。この質問に対する答えは、はるかに明確で包括的であるように見えます。この質問は、さらに詳しく調査される Rubocop に関するニュアンスにも言及しています。
解決策
網羅的な説明は非常に複雑で、Ruby BNF 文法を詳しく調べる必要がありますが、単純な説明では次の 2 つのことを理解する必要があります。
ほんの一例として。 true の場合は関数 4 を取得します。 Ruby はここで何を言いたいのかどうして分かるでしょうか?それは function((true の場合は 4))、または true の場合は function(4) です。 Ruby は「推測」する必要があります。
これは単なる例であり、全体像を理解するには、このルールを以下のルール 2 と組み合わせる必要があります。
これら 2 つのルール 1 と 2 を一緒に受け入れると、次のことが理解できるでしょう。
function (control_statement)
次のように解釈されます:
function((control_statement))
したがって、引数リストで制御ステートメントを使用する場合に許可される唯一の形式は次のとおりです。
Integer.sqrt((4 if true))
他のすべての形式はインタプリタを混乱させるため、Ruby 文法では許可されません。