Подтвердить что ты не робот

Почему методы 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 позволяет определять одноточечные методы для определенных классов объектов, но не для других.

4b9b3361

Ответ 1

Это связано с понятием "немедленные значения", описанным здесь по Matz.

По правде говоря, никакие непосредственные значения не должны допускать метод singleton. Однако в случае true, false и nil на самом деле есть одноэлементные классы, которые возвращают эти значения (или значение на самом деле является одноэлементным классом - я не уверен в этом). Поэтому вы можете добавлять экземпляры singleton в класс поддержки, который проявляется так, как если бы это было значение. Числовые и символьные экземпляры не являются одиночными (очевидно) и не имеют возможности использовать однотонные методы.