混淆了`===`和`。===`的工作

时间:2013-03-03 16:47:37

标签: ruby

case等于运算符===的工作原理如下:

2 === 2  #=> true
2 .=== 2 #=> true

要检查优先级和关联性如何工作,我尝试如下:

2 === 2 === 3
# SyntaxError: (irb):3: syntax error, unexpected tEQQ
# 2 === 2 === 3
#           ^
#        from C:/Ruby193/bin/irb:12:in `<main>'

为什么会返回错误?以下不会引发错误。它如何解决上面的错误?

2 .=== 2 === 3  #=> false

1 个答案:

答案 0 :(得分:6)

Ruby不知道首先要评估哪个表达式,因此会抛出错误。当您使用Integer#===显式调用.===方法时,Ruby会将此视为任何其他方法调用,这意味着它假定右侧的所有内容都是该方法的参数。由于这些可选括号,您实际上是在上一个例子中写的:

2.===( 2 === 3 )

这个表达式反过来并不含糊,因此可以毫无错误地进行评估。

请记住,这不会返回您的预期;例如:

2.===( 2 === 2 )
#=> false

因为内部2 === 2的返回值为true。然后将其与2进行比较,显然2.===(true)会返回false