完全加载类后运行代码

时间:2009-10-04 22:31:23

标签: ruby

class A
  do_something_from_b

  def method_in_a
  end
end

module B
  def self.included base
    base.extend ClassMethods
  end

  module ClassMethods
    def do_something_from_b
      A.class_eval do
        alias_method :aliased_method_in_a, :method_in_a
      end
    end
  end
end

A.send(:include, B)

该代码将失败,因为调用do_somethind_from_b时,method_in_a尚不存在。

有没有办法在class A完全加载后挂钩,没有do_something_from_b调用放在class A的末尾?< / p>

编辑:正如所指出的,代码中存在其他错误,但这不是重点。我只是想说明一下我想要完成什么,在一个类关闭之后运行一些代码(它可以随意重新打开并不重要)。现在我知道这可能是不可能的。

谢谢!

1 个答案:

答案 0 :(得分:6)

在Ruby中,类永远不会完全加载。您可以随时重新打开它。

class A
  def method_in_a
    …
  end
end

无论您的代码在哪里(即使在另一个源代码文件中),您都可以稍后执行。

class A
  alias :aliased_method_in_a :method_in_a
end

或者你可以按照你编写它的方式(这与前面的代码完全相同)

A.class_eval do
  alias :aliased_method_in_a :method_in_a
end

正如您所指出的,A#method_in_a必须存在于您的别名时。为了确保这是真的,你可以做到

require "file_of_class_a"
在您执行别名之前

。如果您不知道何时创建方法A#method_in_a,您可以

class A
  def self.method_added(name)
    alias :aliased_method_in_a :method_in_a if name == :method_in_a
  end
end
只要定义了A中的方法,就会自动调用A.method_added。