ドキュメントでは、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 のほうがより明示的で読みやすい場合もあります)