":: Rails :: Engine"前面的"::"是什么意思

El *_*apo 4 ruby ruby-on-rails

我正在查看Rails引擎教程,其中一个代码块如下所示:

module Blorgh
  class Engine < ::Rails::Engine
    isolate_namespace Blorgh
  end
end
Run Code Online (Sandbox Code Playgroud)

什么::Rails::Engine意思?我知道这可能是一个微不足道的Ruby问题,但是,我似乎无法在任何地方找到任何东西.

谢谢.

jvi*_*ian 7

所以,Ray完全正确.我想补充一个例子.

假设我们有一个名为Foo的引擎(原创,对吗?),它安装在名为Bar的主机应用程序中,类似于:

#bar/config/routes.rb
Rails.application.routes.draw do
  ...
  mount Foo::Engine, at: '/'
  ...
end
Run Code Online (Sandbox Code Playgroud)

Foo有一个application_controller:

#foo/app/controllers/foo/application_controller.rb
module Foo
  class ApplicationController < ActionController::Base
    ...
    def foo_action
      ...
    end
    ...
  end
end
Run Code Online (Sandbox Code Playgroud)

并且Bar有一个application_controller:

#bar/app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
  ...
  def bar_action
    ...
  end
  ...
end
Run Code Online (Sandbox Code Playgroud)

现在,假设我们在Foo引擎中有两个控制器,如:

#foo/app/controllers/foo/baz_controller.rb
module Foo
  def BazController < ApplicationController
    ...
  end
end
Run Code Online (Sandbox Code Playgroud)

#foo/app/controllers/foo/bif_controller.rb
module Foo
  def BifController < ::ApplicationController
    ...
  end
end
Run Code Online (Sandbox Code Playgroud)

BazController从继承ApplicationController(没有::在前面).这意味着它ApplicationController在当前名称空间(Foo)中查找.所以它将具有foo_action定义的Foo::ApplicationController.

BifController从继承::ApplicationController(::在前面).这意味着它ApplicationController在全局命名空间中查找,在本例中,它是主机应用程序Bar.所以它将bar_action在Bar中定义ApplicationController.


Til*_*ilo 5

按层次结构思考所有模块和类:它在顶层寻找“Rails”,在下一层寻找“Engine”。

例如:

  module Rails
    class Engine
    end
  end

  module SomethingElse
    class Rails
    end
  end
Run Code Online (Sandbox Code Playgroud)

::Rails选择第一个代码片段中的模块,该代码片段位于顶层。

::Rails::EngineEngine选择顶级模块中的类Rails


Ray*_*ter 5

::前面的 表示在全局命名空间的顶部::Rails::Engine查找,而不是在命名空间内部查找。Rails::EngineBlorgh

没有对比,没有::这段代码中的 as,

module Blorgh
  class Engine < Rails::Engine
    isolate_namespace Blorgh
  end
end
Run Code Online (Sandbox Code Playgroud)

第二行将寻找Blorgh::Rails,你会得到一个错误,NameError: uninitialized constant Blorgh::Rails