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 或模块,而不是布尔值。
我正在 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 或模块,而不是布尔值。