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