2

我想在我的博客应用程序的 environment.rb 中找到以下行的来源

Blog::Application.initialize!

如果发现初始化!方法仅在源代码中的一处定义。

railties/lib/rails/application.rb

def initialize!(group=:default) #:nodoc:
  raise "Application has been already initialized." if @initialized

然而,它是一个实例方法。

我在 rails 控制台做了一些实验:

Blog::Application.initialize!  # => Application has been already initialized
Blog::Application.method(:initialize!)  # => undefined method for Class
Blog::Application.instance_methods.include?(:initialize!)  # => true

奇怪的是,我们得到了一个未定义的方法,initialize!因为它可以在 Application 类上明确调用。请帮助理解此代码。

4

1 回答 1

0

这是由于一些 Ruby Magic 又名“方法缺失”:

Blog::Application.ancestors
=> [... Rails::Railtie::Configurable ...]

看看configurable.rb

module Rails
  class Railtie
    module Configurable
      extend ActiveSupport::Concern
      module ClassMethods
        [...]

        def method_missing(*args, &block)
          instance.send(*args, &block)
        end
      end
    end
  end
end

它将所有调用委托给底层应用程序实例。

于 2013-11-05T14:41:56.757 回答