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。
我对作用域的理解
我作为 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。