27

有一些 Ruby 类不允许在它们的实例上定义单例方法。例如Symbol

var = :asymbol

def var.hello
  "hello"
end

# TypeError: can't define singleton method "hello" for Symbol

我认为这可能是对所有直接值的限制,但它似乎适用于niltruefalseFixnum(但不适用于or的实例Bignum):

var = true

def var.hello
  "hello"
end

var.hello #=> "hello"

我不明白为什么 Ruby 允许在某些对象类而不是其他对象上定义单例方法。

4

1 回答 1

20

这与Matz在此处描述的称为“立即值”的概念有关。

事实上,没有立即值应该允许单例方法。但是,在、 和的情况下true,实际上有支持这些值的单例类(或者该值实际上是单例类 - 我不确定这一点)。因此,您可以将单例实例添加到支持类,该类的表现就好像它是值本身一样。Numeric 和 Symbol 实例(显然)不是单例,并且无处保存单例方法。falsenil

于 2012-12-19T22:39:53.343 回答