Документ Ruby docs для Object # singleton_class :
Возвращает класс синглтона obj .Этот метод создает новый одноэлементный класс, если obj не имеет такового.
Следовательно, (несмотря на некоторые комментарии) у объекта не всегда есть синглтонучебный класс.Далее я называю объект синглтоном , если этот объект имеет одноэлементный класс.
Вновь созданный объект не имеет одноэлементного класса и, следовательно, не является одноэлементным:
a = "string" # => "string" # not (yet) a singleton
b = String.new("another one") # => "another one" # not (yet) a singleton
[a.class, b.class] # => [String, String]
Объект становится одноэлементным только после определения одноэлементного метода,
def a.greet
"hello"
end
или после создания одноэлементного класса из-за определения переменной класса для одноэлементного класса объекта
class << b
@var = 42
end
К сожалению, в Ruby вызов метода class не показывает, является ли объект одноэлементным, потому что для синглетонов метод не возвращает фактический (singleton) класс, нокласс, используемый для создания объекта:
[a.class, b.class] # => [String, String]
Просто вызов Marshal.dump раскрывает, является ли объект на самом деле одиночным:
Marshal.dump(a, $stdout)
# TypeError: singleton can't be dumped
Marshal.dump(b, $stdout)
# TypeError: singleton can't be dumped
Есть лилюбой другой, более изящный способ узнать, является ли объект одиночным?