Внешний вид синглтон класса - PullRequest
0 голосов
/ 28 февраля 2019

Похоже, что существует контраст между одноэлементными классами nil, false, true и экземпляром пользовательского класса.

i) Синглтон-класс nil, false и true именуются присвоенными им именами констант:

nil.singleton_class #=> NilClass
false.singleton_class #=> FalseClass
true.singleton_class #=> TrueClass

ii) Синглтон-классы nil, false и true появляются в списках предков:

nil.class.ancestors #=> [NilClass, Object, Kernel, BasicObject]
false.class.ancestors #=> [FalseClass, Object, Kernel, BasicObject]
true.class.ancestors #=> [TrueClass, Object, Kernel, BasicObject]

Для одноэлементного класса с именем AClass экземпляра a пользовательского класса A,

class A; end
a = A.new
AClass = a.singleton_class

i) AClass не упоминается какприсвоенное ему постоянное имя:

a.singleton_class #=> #<Class:#<A:0x00007fda832a7eb0>>

ii) AClass не отображается в списке предков:

a.class.ancestors #=> [A, Object, Kernel, BasicObject]

Это ожидаемое поведение?Что делит nil, false, true с одной стороны и a с другой?Из чего следует эта спецификация?

Ответы [ 4 ]

0 голосов
/ 28 февраля 2019

Хороший пример часто говорит больше, чем много слов:

require 'singleton'

class FooClass
  include Singleton
  alias singleton_class class

  def inspect
    'foo'
  end
end

Теперь давайте посмотрим на сходство:

true #=> true
true.class #=> TrueClass
true.singleton_class #=> TrueClass

foo = FooClass.instance # unfortunately the syntax is not exactly the same
foo #=> foo
foo.class #=> FooClass
foo.singleton_class #=> FooClass

Это означает, что true.singleton_class относится к своему собственному классу, а не к классу синглтона.Это имеет смысл, поскольку true является синглтоном, который делает свой собственный класс синглтоном по определению.(Так как это класс синглтона.)

0 голосов
/ 28 февраля 2019

В ruby ​​NilClass, FalseClass и TrueClass могут иметь только один экземпляр.Вот почему у них нет singleton_class.

Например:

a = nil 
def a.foo
  'foo'
end 

b = nil 
b.foo => # foo

Как мы можем видеть, b отвечает на метод foo и возвращает foo строку, даже если мы определили foo метод для переменной a.Это означает, что эти 3 класса могут иметь только один экземпляр.И есть еще один момент, на который следует обратить внимание, что nil, false и true являются переменными, но являются псевдопеременными.Им нельзя назначать разные структуры данных.В некотором смысле они являются замороженными переменными.

0 голосов
/ 28 февраля 2019

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, ...]
0 голосов
/ 28 февраля 2019

Не уверен, поможет ли это, но из документов для singleton_class:

Если obj равен nil, true или false, этовозвращает NilClass, TrueClass или FalseClass соответственно.

Таким образом, singleton_class имеет специальное поведение для nil, true и false вместо стандартного поведениявозврата синглтон-класса объектов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...