我知道 TOPLEVEL_BINDING 是 main 的 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
在查看机架的来源时,我感到困惑。问题在于理解文件中的这段代码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
new_from_string 方法传递 config.ru 文件的内容,该文件类似于
run DemoApp::Application
这里似乎 TOPLEVEL_BINDING 指的是 Builder 对象,因为该方法run
是为 Builder 定义的,而不是为 Object 定义的。然而,前面的实验确定 TOPLEVEL_BINDING 指的是 main 的绑定。我不明白 run 方法是如何在这里工作的。请帮助我理解这段代码。