Ответ 1
Нет разницы для define_method
. Но есть разница, когда вы используете def
.
o = Object.new
# class_eval example
class << o; self; end.class_eval { def test1; :test1; end }
o.test1 #=> test1
# instance_eval example
class << o; self; end.instance_eval { def test2; :test2; end }
o.test2 #=> NoMethodError
Почему разница в поведении между def
и define_method
? define_method
является вызовом метода и, таким образом, действует на self
в контексте eval. self
как в instance_eval
и в class_eval
- одно и то же - это получатель (собственный класс o).
Однако def
ведет себя по-разному, он работает не на самом self
а на default define
по default define
. В случае class_eval
определение по default definee
- это то же самое, что и self
но для instance_eval
это метакласс self
.
Как нам получить доступ к методу test2
определенному выше? test2 должен быть методом экземпляра, определенным в метаклассе собственного класса o.
Это метод класса на собственном классе o:
class << o; test2; end #=> :test2