Rubyのキーワードとは一体何なのでしょうか?

概要

ドキュメントでは、not は単なる ! の綴りであると主張しています。 (優先順位が異なると思われます)。

パーサーはこう言っています

expr        : command_call
                | keyword_not '\n'? expr
                    {
                        $$ = call_uni_op(p, method_cond(p, $3, &@3), METHOD_NOT, &@1, &@$);
                    /*% ripper: unary!(ID2VAL(idNOT), $:3) %*/
                    }

ただし、すべての式が有効であるわけではありません。かなり括弧が必要です。これは本当に求められているのでしょうか?

irb> x = !true
=> false

irb> not true
=> false

irb> x = !true
=> false

irb> x = not true
/Users/akim/.gem/ruby/3.3.0/gems/irb-1.12.0/lib/irb/workspace.rb:117:in `eval': (irb):3: syntax error, unexpected `true', expecting '(' (SyntaxError)
x = not true
        ^~~~

    from <internal:kernel>:187:in `loop'
    from /Users/akim/.gem/ruby/3.3.0/gems/irb-1.12.0/exe/irb:9:in `<top (required)>'
    from /opt/local/bin/irb:25:in `load'
    from /opt/local/bin/irb:25:in `<main>'

irb> x = not(true)
=> false

irb> x = (not true)
=> false

(IRB の動作は MRI の動作と正確に一致します。)

解決策

はいでもいいえでも、それはユースケースによって異なります。代入の場合、not の優先順位が低いことは、代入演算子のために括弧が必要になるため、実際には役に立ちません。

ただし、if と組み合わせると、優先順位が低いため、括弧を省略できます。

if not a == b
  # do something
end

とは対照的に !これは優先順位が最も高いため、括弧が必要です。

if !(a == b)
  # do something
end

(ここでは、Unless を使用することもできますが、場合によっては、If Not のほうがより明示的で読みやすい場合もあります)