我了解TOPLEVEL_BINDING是主要绑定对象。以下代码证实了这一点:
def name
:outer
end
module Test
class Binder
def self.name
:inner
end
def self.test_it
eval 'name', TOPLEVEL_BINDING
end
end
end
p Test::Binder.test_it # => :outer
我在查看Rack的源代码时感到困惑。问题出在理解文件lib/rack/builder.rb
中的这段代码上。
def self.new_from_string(builder_script, file="(rackup)")
eval "Rack::Builder.new {\n" + builder_script + "\n}.to_app",
TOPLEVEL_BINDING, file, 0
end
def run(app)
end
新的`from_string`方法需要传递一个`config.ru`文件的内容,该文件类似于:
run DemoApp::Application
在这里,TOPLEVEL_BINDING似乎是指一个Builder对象,因为方法“run”是为Builder而不是Object定义的。然而,早期的实验表明TOPLEVEL_BINDING指的是main的binding。我不理解run方法在这里是如何工作的。请帮助我理解这段代码。
TOPLEVEL_BINDING.eval
,都会得到“Running 10”。看起来rack
开发人员试图为应用程序提供干净的环境,但如果有人问我否则可能出什么问题......我没有答案。你呢? - x-yuri