Module如何改变作用域?

How does Module change the scope?

我对作用域的理解

我作为 Javascript 开发人员已经很长时间了,对此我已经习惯了...

var globalVar = "some value";

getGlobalVar = function(){
  alert(globalVar);
}
getGlobalVar();

在 Javascript 中,在函数外部定义的所有内容都附加到 window 对象,并成为全局范围的一部分。任何属于全局范围的内容都可以在任何函数中访问——至少据我所知。我正在尝试在 Ruby 中做类似的事情,但出现错误。

问题

我的代码是这样工作的:

# create CoreController
SINATRA = Sinatra
module Apollo
  class Sinatra < SINATRA::Base
    configure :development do
      register SINATRA::Reloader
      also_reload "app/**/*.rb"
      dont_reload "lib/**/*.rb"
    end

    include CoreHelpers
    include Helpers

    # ----- Config ------
    configure do
      set :public_folder, Apollo.config[:sinatra][:public]
      set :views, Apollo.config[:sinatra][:views]
      set :static_cache_control, [:public, {:max_age => 600}]
      enable :sessions
      # Set the session secret
      set :session_secret, "secret"
    end
  end
end

我添加了 SINATRA = Sinatra 作为 hack,因为我无法访问 class Sinatra < SINATRA::Base 中的 Sinatra::Reloader

我希望代码如下所示:

# create CoreController
module Apollo
  class Sinatra < Sinatra::Base
    configure :development do
      register Sinatra::Reloader
      also_reload "app/**/*.rb"
      dont_reload "lib/**/*.rb"
    end

    include CoreHelpers
    include Helpers

    # ----- Config ------
    configure do
      set :public_folder, Apollo.config[:sinatra][:public]
      set :views, Apollo.config[:sinatra][:views]
      set :static_cache_control, [:public, {:max_age => 600}]
      enable :sessions
      # Set the session secret
      set :session_secret, "secret"
    end
  end
end

这是我遇到的错误:

将这段代码放在 class 中如何改变作用域?全局变量不应该在任何地方都可以访问吗?感谢您提供任何帮助。

我不确定我是否掌握了所有技术细节,但是当你有 class Sinatra 并且你在 class 块中使用 Sinatra::Something 时,ruby 解释它作为 "he wants to access the constant Something in this class"。 如果将 class 名称更改为 Sinatra 以外的其他名称,应该没问题。或者你可以使用双冒号作为前缀,像这样

# create CoreController
module Apollo
  class Sinatra < ::Sinatra::Base
    configure :development do
      register ::Sinatra::Reloader
      also_reload "app/**/*.rb"
      dont_reload "lib/**/*.rb"
    end

    include CoreHelpers
    include Helpers

    # ----- Config ------
    configure do
      set :public_folder, Apollo.config[:sinatra][:public]
      set :views, Apollo.config[:sinatra][:views]
      set :static_cache_control, [:public, {:max_age => 600}]
      enable :sessions
      # Set the session secret
      set :session_secret, "secret"
    end
  end
end

它基本上说 ruby 在 class Sinatra 之外寻找另一个 Sinatras。