[英]Ruby singleton methods with (class_eval, define_method) vs (instance_eval, define_method)
红宝石中的元编程很棒,因为我经常使用它来模仿基于原型的编程,并快速编写原型解决方案来测试某些问题以测试其可行性。 因此,我想知道以下代码段之间是否有本质区别:
(class << some_object; self; end).class_eval do
define_method(:method_name) do ... method body ... end
end
和
(class << some_object; self; end).instance_eval do
define_method(:method_name) do ... method body ... end
end
这两个版本的代码都定义了一个单例方法,我还没有遇到任何迫使我选择(instance_eval, define_method)
组合而不是(class_eval, define_method)
组合来定义一个单例方法的问题,我想知道两者之间是否有本质区别。
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
是一个方法调用,因此在eval上下文中对self
进行操作。 在self
两个instance_eval
和class_eval
是相同的-它是接收机(邻的eigenclass)。
但是def
行为有所不同,它不会对self
进行操作,而是对default define
。 在class_eval
的default definee
下, default definee
与self
相同,但对于instance_eval
它是self
的元类。
我们如何访问上面定义的test2
方法? test2必须是在o的本征类的元类上定义的实例方法。
它是o的本征类的类方法:
class << o; test2; end #=> :test2
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.