Ruby “define_method”是否在类的每个实例化上运行?

Ruby “define_method”是否在类的每个实例化上运行?,ruby,performance,metaprogramming,Ruby,Performance,Metaprogramming,当我的类动态创建一组方便的方法时,如下所示: class MyClass < ActiveRecord::Base ... %w(foo bar baz).freeze.each do |part_one| %w(alpha beta gamma).freeze.each do |part_two| define_method "#{part_one}_#{part_two}" do lookup_stuff(part_one, part_two

当我的类动态创建一组方便的方法时,如下所示:

class MyClass < ActiveRecord::Base
  ...
  %w(foo bar baz).freeze.each do |part_one|
    %w(alpha beta gamma).freeze.each do |part_two|
      define_method "#{part_one}_#{part_two}" do
        lookup_stuff(part_one, part_two)
      end
    end
  end
  ...
end
classmyclass
迭代和方法创建是针对类的每个实例,还是仅在第一次解析类并创建该类的模型对象时发生一次


我有一种预感,它只会发生一次,但我在文档中找不到任何可以证实这一点的东西。

通常,只有在类定义的一部分时,才会对该代码进行一次计算,如:

您可以使用“printf调试”找到:

现在,这将发出一些您可以使用的诊断输出


RubyonRails自动加载程序开发环境中的例外情况是,
app/
中的内容将在每个请求而不是每个进程中加载一次。

Ruby中的方法总是在模块(或类,这是一种特定的模块)上定义,而不是在实例上定义。虽然可以在实例上定义方法,例如

class Foo; end
foo = Foo.new
def foo.quux
  puts "QUUX"
end
foo.quux # => QUUX
bar = Foo.new
bar.quux # => QUUX
这实际上是将该方法放在所谓的单例类
foo
,它是foo的后代。Ruby中没有在实例上定义方法。当调用方法时,将在继承链中查找该方法


您的
define_方法
将在执行时用方法填充
self.class
;从那时起,
self.class
或其后代的任何实例都可以访问它们。

您可以通过插入一个
put{part_one}“
来查找,以查看何时对其求值。这取决于此代码的定义位置(例如在initialize方法中)。您能否完成示例(例如,将其包装在类中)?@Felix,为示例添加了说明-谢谢!
class Example
  puts "Am I being run once or a whole bunch of times?"

  %w[ foo bar baz ].each do |...|
  end
end
class Foo; end
foo = Foo.new
def foo.quux
  puts "QUUX"
end
foo.quux # => QUUX
bar = Foo.new
bar.quux # => QUUX