或者更确切地说,确定是如何起作用的?
它发生在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.path
是map
-Enumerator 结果的元素?但是为什么不应该l.absolute_path
存在呢?
其次,我不理解由detect
-Enumerator 和正则表达式(-operator)组成的构造。
detect
Enumerator 采用表达式 here!~
为真的第一个元素。好的。
但是表达式如何,如果路径p
不匹配,则为真
railties[\w.-]*/lib/rails
“或”(管道)
rack[\w.-]*/lib/rack
换句话说:Rails.application.root 是第一个不匹配两个正则表达式模式之一的路径。正确的?
但如果是这样,那么:为什么?
(如果我可以问,super
在这种情况下是什么方法?)
谢谢
冯·斯波茨