Ruby on rails 为什么这些方法不能在运行时由define_方法动态定义?

Ruby on rails 为什么这些方法不能在运行时由define_方法动态定义?,ruby-on-rails,ruby,metaprogramming,Ruby On Rails,Ruby,Metaprogramming,因此,我在Rails 4.2应用程序中有以下类,它使用define_方法在运行时动态定义类方法。当我启动rails控制台时,它说Dynamic.kite_flying和Dynamic.tail_flying方法不存在。当我在动态类上调用这些方法时,是否缺少定义这些方法的内容 class Dynamic def self.hello_world puts "hello" end ["kite", "tail"].each do |arg| define_method("

因此,我在Rails 4.2应用程序中有以下类,它使用define_方法在运行时动态定义类方法。当我启动rails控制台时,它说Dynamic.kite_flying和Dynamic.tail_flying方法不存在。当我在动态类上调用这些方法时,是否缺少定义这些方法的内容

class Dynamic
  def self.hello_world
    puts "hello"
  end
  ["kite", "tail"].each do |arg|
    define_method("self.#{arg}_flying") do |word_name, list|
      puts "hello some dynamic #{arg}_flying"
    end
  end

end

define_method
不定义类方法,它定义实例方法。您希望
define\u singleton\u method
在上面的代码中定义类方法。

请注意,这些方法的定义非常好。您定义了两个名为
self.kite\u flying
self.tail\u flying
的方法。这些是非法的方法名称,但Ruby不会阻止您定义它们,您仍然可以使用反射调用它们:
foo=Dynamic.new;foo.send(:'self.kite_-flying',nil,nil)#你好,一些动态风筝_-flying
。您还可以看到它们的定义:
Dynamic.public\u-instance\u-methods(false)。grep(/flying/)\#=>[:'self.kite\u-flying',:'self.tail\u-flying']
。说“
define\u-method
没有定义类方法”并不准确。如果将行
define_方法(“self.{arg}_flying”)do|word_name,list|
替换为
singleton_类。send(:define_方法,“{arg}_flying”)do| word_name,list|
,然后
Dynamic.methods(false)=>[:hello_world,:kite#flying,:tail|flying]
Dynamic.kite_-flying 1,2#=>你好,一些动态风筝_-flying
。(参数
1
snd
2
是任意的,但需要两个参数。即使在这里它定义了一个实例方法,只是您提供的实例是
singleton_类
实例。但是
define_方法
本身仍然在接收器上定义一个实例方法。只有
define_singleton_方法
对功能进行包装,以便它在接收器本身上定义类方法。Rails标记在这里不合适。您在Rails应用程序中遇到了这个问题,但这实际上是一个纯Ruby问题。一些过滤掉Rails问题的读者可能会因为标记而错过您的问题。