模块如何改变范围?

时间:2017-03-22 12:53:36

标签: ruby scope sinatra

我对范围的理解

我很长一段时间以来一直是Javascript开发人员,我已经习惯了......



var globalVar = "some value";

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




在Javascript中,在函数外部定义的所有内容都附加到窗口对象,并成为全局范围的一部分。任何属于全球范围的东西都可以在任何函数中访问 - 至少就我所知。我试图在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作为黑客,因为我无法访问Sinatra::Reloader内的class Sinatra < SINATRA::Base

这就是我希望代码看起来像:

# 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

以下是我遇到的错误:

enter image description here

如何将此代码放入类中更改范围?不可能在任何地方访问全局变量吗?任何和所有的帮助表示赞赏。

1 个答案:

答案 0 :(得分:1)

我不确定我是否掌握了所有的技术性,但是当你有班级Sinatra并且你在类块中使用Sinatra :: Something时,ruby将其解释为&#34;他想要访问常量Something in this类&#34 ;. 如果你将班级名称更改为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

它基本上说红宝石在Sinatra班级之外寻找另一个Sinatras。