为什么不能在Symbols或Fixnums上定义单例方法?

时间:2012-12-19 22:12:38

标签: ruby

有些Ruby类不允许在其实例上定义单例方法。例如,Symbol

var = :asymbol

def var.hello
  "hello"
end

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

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

var = true

def var.hello
  "hello"
end

var.hello #=> "hello"

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

1 个答案:

答案 0 :(得分:20)

这与Matz所描述的{立体值'概念有关。{/ 3}}。

事实上,没有立即值应该允许单例方法。但是,在truefalsenil的情况下,实际上有单个类支持这些值(或者值实际上是单例类 - 我不确定这个)。因此,您可以将单例实例添加到支持类,该类显示就像值本身一样。数字和符号实例不是单例(显然)并且无处可以容纳单例方法。