Ответ 1: (короткий) Они вызываются, когда ruby создает экземпляр MyClass
экземпляра (типа Class
).
(long) Когда интерпретатор Ruby видит определение класса (class MyClazz
), он создает экземпляр этого класса и оценивает весь код внутри определения класса.
В вашем случае MyClazz
- это константа, которая содержит ссылку на объект класса Class
. И когда Ruby его инициализирует, он выполняет код внутри определения класса - определяет одноэлементный метод my_class_method
этого экземпляра Class
и дважды выполняет метод my_class_method
в контексте этого экземпляра Class
.
Ответ 2: (короткий) Module#define_method
закрытый метод добавляет метод в таблицу методов экземпляра Class
instance (таблица методов содержит методы экземпляра класса). Это не влияет на собственный класс объекта istance / объекта класса.
(long) Когда вы вызываете метод экземпляра для объекта, Ruby сначала ищет этот метод в собственном классе этого объекта, а затем в суперклассе собственного класса (это будет Class
объект класс объекта). Но это не будет выглядеть в собственном классе MyClazz
объект.
Пример:
obj = MyClazz.new
obj.foo # => ok
obj.foo
будет искать определение метода foo
в собственном классе объекта obj
, затем будет искать методы экземпляра MyClass
(экземпляр класса Class
), затем в суперклассе MyClass
объекта (в вашем случае это Object
класс) и т. д.
obj = MyClass.new
MyClass.my_class_method :baz
obj.baz # => ok
MyClass.my_class_method
будет искать определение my_class_method
метода в собственном классе MyClass
объекта (sidenote: собственный класс класса иногда
называется метакласс ), и он найдет его здесь и добавит baz
метод экземпляра к классу MyClass
.