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