在Fixnum的实例上定义方法

时间:2017-07-09 20:43:08

标签: ruby literals singleton-methods

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

object = Object.new
def object.foo
  puts "5"
end

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

def 3.foo
  puts "3"
end

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

这是什么原因?

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

1 个答案:

答案 0 :(得分:5)

这里有两件事情。

有一点是Fixnum s不能有单例方法。但是,我们还没有达到这一点,因为你的代码有语法错误,因此Ruby甚至没有尝试来运行它。

第二件事是Ruby的语法很复杂,因此有很多黑暗的案例。你好像找到了一个,.符号的不同用法意味着小数分隔符和方法选择符以神秘的方式相互冲突。

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

object = 3

def object.foo
  puts "3"
end
# TypeError: can't define singleton