为什么在减号和数字之间允许有空格?

Kri*_*ris 2 ruby

这些是预期的:

-3 # => -3
0 - 3 # => -3
Run Code Online (Sandbox Code Playgroud)

但是这里发生了什么:

- 3 # => -3
Run Code Online (Sandbox Code Playgroud)

我的第一个想法是-隐含的方法self,即self.-(3)如此定义的KernelObject.但尝试这样做会导致NoMethodError: undefined method.

tad*_*man 7

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)