Ruby: У синглтон-классов действительно есть анонимные классы? - PullRequest
0 голосов
/ 17 ноября 2018

В главе 24.2 Одиночные книги Программирование на Ruby 1.9 и 2.0 , приведен следующий код:

animal = "cat"
def animal.speak
  puts "The #{self} says miaow"
end

И объясняется как: «Когдамы определили одноэлементный метод для объекта " cat ", Руби создал новый анонимный класс и определил в этом классе метод speak . Этот анонимный класс называется одноэлементным классом (а иногда и собственный класс ). "

К сожалению, я не могу проверить, что Ruby (2.5.1) фактически создает собственный анонимный класс:

str = "a string"                 # => "a string"
[str, str.object_id]             # => ["a string", 47279316765840]
[str.class, str.class.object_id] # => [String, 47279301115420]

def str.greet
  "hello"
end                              # => :greet

str.greet                        # => "hello"

[str, str.object_id]             # => ["a string", 47279316765840]
[str.class, str.class.object_id] # => [String, 47279301115420]

Как видно выше, класс str не изменяется после определения метода singleton greet : он по-прежнему отображается как String с тем же object_id 47279301115420.

Итак, где же анонимный класс?

1 Ответ

0 голосов
/ 17 ноября 2018
str = "a string"                 # => "a string"
[str, str.object_id]             # => ["a string", 47279316765840]
[str.class, str.class.object_id] # => [String, 47279301115420]

def str.greet
  "hello"
end                              # => :greet

str.greet                        # => "hello"

Ruby скрывает собственный класс , когда вы спрашиваете str.class или смотрите цепочку предков (str.class.ancestors). Однако вы можете получить ссылку на собственный класс, вернув self после проверки в его классе, используя <<

str_class = class << str
  self
end
# => #<Class:#<String:0x007fbba28b3f20>>

str_class.instance_methods(false) #=> [:greet] # the singleton method you defined becomes the instance method of this eigenclass. :)

str_class.ancestors
[#<Class:#<String:0x007fbba28b3f20>>, String, Comparable, Object, Kernel, BasicObject]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...