define_method
是Module
的方法。
在Ruby 2.0中,define_method
可以在顶层使用;它不必在类或模块中。
define_method :kick do
puts "method"
end
在Ruby 1.9中,main
对象没有方法define_method
。
define_method :kick
# => NoMethodError: undefined method `define_method' for main:Object
Ruby 2.0如何实现这个目标?
答案 0 :(得分:2)
我也很好奇这个功能,并使用irb尝试一下。请看一下:
% irb
2.0.0-p353 :001 > method(:define_method)
=> #<Method: main.define_method>
2.0.0-p353 :002 > private_methods(false)
=> [:public, :private, :include, :using, :define_method, :irb_exit_org, :default_src_encoding, :irb_binding]
2.0.0-p353 :003 > singleton_class.private_instance_methods(false)
=> [:public, :private, :include, :using, :define_method, :irb_exit_org]
它表明define_method是主对象的私有单例方法(顶级自我)。
答案 1 :(得分:0)
在uncutstone的侦察的基础上,main的单例类不继承define_method():
class <<self
p private_instance_methods(false)
end
--output:--
[:public, :private, :include, :using, :define_method]
...并且据我所知,如果一个方法没有被继承,那么它必须在类中定义。请注意,当您包含模块时,ruby会创建一个匿名类并在匿名类中插入模块的defs,然后将匿名类直接插入到方法查找链中的包含类之上,例如:
module A
def greet
puts 'hi'
end
end
class Dog
include A
end
p Dog.instance_methods(false)
p Dog.instance_methods.grep(/^g/)
--output:--
[]
[:greet]
输出显示greet()是一个继承的方法。但是因为main的singleton类没有继承define_method(),所以不能通过包含模块来获取define_method()。相反,似乎必须在main的单例类中定义define_method()。因此,实现这种方法的一种方法是让ruby解释器在解析代码之前执行以下代码:
class <<self
def define_method(x, *y)
#same code as in Module's define method
end
end