主要的Ruby 2.0 define_method

时间:2013-09-27 14:30:47

标签: ruby

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如何实现这个目标?

2 个答案:

答案 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