Почему методы Singleton не могут быть определены на 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 позволяет определять одноточечные методы для определенных классов объектов, но не для других.
Ответы
Ответ 1
Это связано с понятием "немедленные значения", описанным здесь по Matz.
По правде говоря, никакие непосредственные значения не должны допускать метод singleton. Однако в случае true
, false
и nil
на самом деле есть одноэлементные классы, которые возвращают эти значения (или значение на самом деле является одноэлементным классом - я не уверен в этом). Поэтому вы можете добавлять экземпляры singleton в класс поддержки, который проявляется так, как если бы это было значение. Числовые и символьные экземпляры не являются одиночными (очевидно) и не имеют возможности использовать однотонные методы.