Ruby 的“not”关键字到底是什么?

问题描述 投票:0回答:1

文档声称

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 的行为完全匹配。)

ruby grammar
1个回答
0
投票

这真的是想要的吗?

是或否,这取决于用例。对于赋值,

not
的低优先级并不是很有用,因为由于赋值运算符它需要括号。

然而,当与条件结合时,其低优先级允许省略括号:

if not a == b
  # do something
end

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

(您也可以在这里使用

unless
,但有时
if not
更明确/更易于阅读)

© www.soinside.com 2019 - 2024. All rights reserved.