В главе 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.
Итак, где же анонимный класс?