1

或者更确切地说,确定是如何起作用的?

它发生在in 的定义base.called_from/lib/rails/engine.rb

def inherited(base)
    unless base.abstract_railtie?
      Rails::Railtie::Configuration.eager_load_namespaces << base

      base.called_from = begin
        call_stack = caller_locations.map { |l| l.absolute_path || l.path }

        File.dirname(call_stack.detect { |p| !p.match?(%r[railties[\w.-]*/lib/rails|rack[\w.-]*/lib/rack]) })
      end
    end

  super
end 

的调用Kernel#caller_locations返回一个Thread::Backtrace::Location-objects 数组,对吗?

首先,我不明白传递给 map 的块中的成语:

l.absolute_path || l.path

它是否要确保如果l.absolute_path为 nil 则至少l.pathmap-Enumerator 结果的元素?但是为什么不应该l.absolute_path存在呢?

其次,我不理解由detect-Enumerator 和正则表达式(-operator)组成的构造。

detectEnumerator 采用表达式 here!~为真的第一个元素。好的。

但是表达式如何,如果路径p不匹配,则为真

railties[\w.-]*/lib/rails

“或”(管道)

rack[\w.-]*/lib/rack

换句话说:Rails.application.root 是第一个不匹配两个正则表达式模式之一的路径。正确的?

但如果是这样,那么:为什么?

(如果我可以问,super在这种情况下是什么方法?)

谢谢

冯·斯波茨

4

0 回答 0