1.nil
, false
, true
объекты
i) Синглтон-классы nil, false и true называются назначенными им именами констант:
Это не правильно.Метод singleton_class
nil
, true
и false
не возвращает их одноэлементные классы, так как они не существуют.Вместо этого он возвращает их фактические классы.Причина, по которой эти объекты не имеют одноэлементных классов, очевидна и хорошо описана в ответе @ zeitnot.
Такое поведение ожидается и документировано здесь https://ruby -doc.com / core / Object.html # method-i-singleton_class
ii)Синглтон-класс nil, false и true отображается в списках предков
Это тоже не правильно.Поскольку эти объекты не имеют одноэлементных классов, в списке предков вы видите их фактические классы.Но даже если бы у них были синглтон-классы, вы бы не получили их таким образом (продолжайте чтение, чтобы узнать почему)
2.экземпляр a
пользовательского класса A
i) На AClass не ссылается присвоенное ему постоянное имя:
AClass = a.singleton_class
Этот код делает AClass
ссылкой на a.singleton_class
.Но это однонаправленное отношение (от AClass
до a.singleton_class
).a.singleton_class
не ссылается и не возвращает AClass
, как вы ожидаете.
ii) AClass не отображается в списке предков:
Toполучить список предков, включая синглтон-класс execute a.singleton_class.ancestors
вместо a.class.ancestors
.
a.singleton_class.ancestors #=> [#<Class:#<A:0x000000000191dba0>>, A, Object, Kernel, BasicObject]
Метод ancestors
просматривает только иерархию:
class A; end
class B < A; end
class C < B; end
A.ancestors # => [A, ...]
B.ancestors # => [B, A, ...]
C.ancestors # => [C, B, A, ...]