Parens required or Ruby says: TypeError (class or module required) ...为什么?

Parens required or Ruby says: TypeError (class or module required) ... why?

我正在 irb、Ruby 版本 3 中尝试:

3.0.0 :001 > num = 42
 => 42 
3.0.0 :002 > num.is_a?(Integer) && num > 10
 => true 
3.0.0 :003 > num.is_a? Integer && num > 10
Traceback (most recent call last):
        5: from /Users/kai/.rvm/rubies/ruby-3.0.0/bin/irb:23:in `<main>'
        4: from /Users/kai/.rvm/rubies/ruby-3.0.0/bin/irb:23:in `load'
        3: from /Users/kai/.rvm/rubies/ruby-3.0.0/lib/ruby/gems/3.0.0/gems/irb-1.3.0/exe/irb:11:in `<top (required)>'
        2: from (irb):3:in `<main>'
        1: from (irb):3:in `is_a?'
TypeError (class or module required)

为什么这里需要括号:

v.is_a?(Integer)

?

运算符优先级如何工作?

为什么 Ruby 在这种情况下会生成这样一个神秘的错误消息?

通过一些挖掘,我找到了之前在这里回答的问题: Ruby 'is_a?' class or module required (TypeError)

以及此处解决的基本问题:

参考官方Ruby文档: https://ruby-doc.org/core-3.0.0/doc/syntax/precedence_rdoc.html

但我觉得我的所有问题都没有得到解答。有人想把所有这些都包起来吗?

Why do I need the parentheses here:

v.is_a?(Integer)

您需要括号来指定要传递给 is_a? 方法的内容。没有它们,Ruby 计算整个 Integer && num > 10 表达式并将 that 传递给方法。

How does the operator precedence work?

is_a? 不是运算符,因此没有优先顺序。表达式在传递给方法之前先求值,这就是所有发生的事情。

And why does Ruby generate such an arcane error message in this scenario?

Ruby 正在计算表达式 Integer && num > 10,它给出 true。然后将该值传递给 num.is_a?is_a? 然后给出 TypeError 因为它期望 class 或模块,而不是布尔值。