文档声称
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 not a == b
# do something
end
与
if !(a == b)
# do something
end
(您也可以在这里使用
unless
,但有时 if not
更明确/更易于阅读)