在 Fixnum 的实例上定义方法

Defining methods on instances of Fixnum's

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

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

这是什么原因?

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

这里有两件事在起作用。

一件事是 Fixnums 不能有单例方法。但是,我们还没有到那个时候,因为您的代码有语法错误,因此 Ruby 甚至 attempt 到 运行 都没有第一名。

其次,Ruby语法复杂,暗角案例较多。您似乎已经找到了一个,其中 . 符号的不同用法以表示小数点分隔符和方法选择器的方式以神秘的方式相互冲突。

现在,当然,这实际上并不是什么大问题,因为正如我之前提到的,Fixnums 无论如何都不能有单例 class:

object = 3

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