这些是预期的:
-3 # => -3
0 - 3 # => -3
Run Code Online (Sandbox Code Playgroud)
但是这里发生了什么:
- 3 # => -3
Run Code Online (Sandbox Code Playgroud)
我的第一个想法是-隐含的方法self,即self.-(3)如此定义的Kernel或Object.但尝试这样做会导致NoMethodError: undefined method.
Ruby有一个非常宽容的语法,并允许这样的事情.这被解析为一元减号运算符.它否定了右边的任何东西.
也类似:
-(3)
# => -3
-(-(-3))
# => -3
- (3)
# => -3
Run Code Online (Sandbox Code Playgroud)
它类似于你怎么能忽略对方法调用括号:foo x是有效的,但是foo(x)是隐含的.你也可以这样做,foo (x)虽然这可能导致歧义,所以它通常不赞成.
正如Dave Newton指出的那样,内部实际上是:
3.send(:-@)
Run Code Online (Sandbox Code Playgroud)