为什么不能在Symbols或Fixnums上定义单例方法?
有些Ruby类不允许在其实例上定义单例方法。 例如, Symbol
:
var = :asymbol def var.hello "hello" end # TypeError: can't define singleton method "hello" for Symbol
我认为这可能是对所有直接值的限制,但它似乎适用于nil
, true
和false
(但不是Fixnum
或Bignum
实例):
var = true def var.hello "hello" end var.hello #=> "hello"
我不明白为什么Ruby允许在某些对象类而不是其他对象上定义单例方法。
这与Matz所描述的称为“立即值”的概念有关。
事实上,没有立即值应该允许单例方法。 但是,在true
, false
和nil
的情况下,实际上有单个类支持这些值(或者值实际上是单例类 – 我不确定这一点)。 因此,您可以将单例实例添加到支持类,该类显示为值本身。 数字和符号实例不是单例(显然)并且无处可以保持单例方法。