在Fixnum的实例上定义方法

Nat*_*han 1 ruby singleton-methods literals

我可以在这样的实例上定义一个方法:

object = Object.new
def object.foo
  puts "5"
end
Run Code Online (Sandbox Code Playgroud)

尝试与a类似的东西Fixnum不起作用:

def 3.foo
  puts "3"
end

def 3.foo
     ^
(irb):7: syntax error, unexpected keyword_end, expecting end-of-input
Run Code Online (Sandbox Code Playgroud)

这是什么原因?

我知道这是我永远不应该做的事情.我只是想知道为什么这不像我预期的那样工作.

Jör*_*tag 5

这里有两件事情在玩.

有一点是Fixnums不能有单例方法.但是,我们还没有到那时,因为你的代码有语法错误,因此Ruby甚至没有尝试首先运行它.

第二件事是Ruby的语法很复杂,因此有许多暗角情况.您似乎找到了一个,其中.符号的不同用法意味着小数分隔符和方法选择器以神秘的方式相互冲突.

当然,现在,这实际上并不是一个大问题,因为正如我前面提到的那样,Fixnums无论如何都不能有单例类:

object = 3

def object.foo
  puts "3"
end
# TypeError: can't define singleton
Run Code Online (Sandbox Code Playgroud)