Почему методы 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 в класс поддержки, который проявляется так, как если бы это было значение. Числовые и символьные экземпляры не являются одиночными (очевидно) и не имеют возможности использовать однотонные методы.