主要的Ruby 2.0 define_method

define_methodModule一种方法。

在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如何实现这一点?

我也很好奇这个function,并使用irb尝试一下。 请看一下:

 % irb 2.0.0-p353 :001 > method(: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是主对象的私有单例方法(顶级自我)。

在uncutstone的调查基础上,define的主要单例类不inheritancedefine_method():

 class < 

...并且据我所知,如果方法不是inheritance的,则必须在类中定义。 请注意,当您包含模块时,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()是一个inheritance的方法。 但是因为main的singleton类没有inheritancedefine_method(),所以不能通过包含模块来获取define_method()。 相反,似乎必须在main的singleton类中定义define_method()。 因此,实现这种方法的一种方法是让ruby解释器在解析代码之前执行以下代码:

 class <