【问题标题】:How does Module change the scope?Module 如何改变范围?
【发布时间】:2017-03-22 21:56:30
【问题描述】:

我对范围的理解

我长期从事 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 作为 hack,因为我无法在 class Sinatra &lt; 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

这是我得到的错误:

将此代码放入类中如何改变范围?全局变量不应该在任何地方都可以访问吗?感谢您提供任何和所有帮助。

【问题讨论】:

    标签: ruby scope sinatra


    【解决方案1】:

    我不确定我是否掌握了所有技术细节,但是当你有 Sinatra 类并且你在类块中使用 Sinatra::Something 时,ruby 将其解释为“他想访问这个类中的常量 Something”。 如果您将类名更改为 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​​ 在 Sinatra 类之外寻找另一个 Sinatra。

    【讨论】:

    • 所以基本上,出于某种原因,Ruby 假设我正在查看此类而不是全局范围。如果当我得到一个未定义的错误时它会自动检查全局范围会很好,有点像局部变量如何覆盖 Javascript 中的全局,但你仍然可以访问全局范围。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-06
    • 1970-01-01
    • 1970-01-01
    • 2013-10-02
    • 2012-11-23
    • 1970-01-01
    • 2020-06-16
    相关资源
    最近更新 更多