gpt4 book ai didi

ruby - 了解 ruby TOPLEVEL_BINDING

转载 作者:太空宇宙 更新时间:2023-11-03 16:28:43 26 4
gpt4 key购买 nike

我知道 TOPLEVEL_BINDING 是 main 的绑定(bind)对象。以下代码证实了这一点:

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

向 new_from_string 方法传递 config.ru 文件的内容,类似于

run DemoApp::Application

这里似乎 TOPLEVEL_BINDING 指的是 Builder 对象,因为方法 run 是为 Builder 而不是为 Object 定义的。然而,较早的实验确定 TOPLEVEL_BINDING 指的是 main 的绑定(bind)。我不明白 run 方法在这里是如何工作的。请帮助我理解这段代码。

最佳答案

TOPLEVEL_BINDING 顶级绑定(bind)。

该方法将字符串“run ...”传递到 Builder.new { run ... }

Builder.new 然后在 block 上执行 instance_eval ( https://github.com/rack/rack/blob/df1506b0825a096514fcb3821563bf9e8fd52743/lib/rack/builder.rb#L53-L55 ),从而使 block 内的代码可以直接访问实例的方法。

def initialize(default_app = nil,&block)
@use, @map, @run, @warmup = [], nil, default_app, nil
instance_eval(&block) if block_given?
end

run 是 Builder 类的实例方法,定义在这里 -> https://github.com/rack/rack/blob/df1506b0825a096514fcb3821563bf9e8fd52743/lib/rack/builder.rb#L103-L105

def run(app)
@run = app
end

简而言之,“运行 DemoApp::Application” 变成:

Rack::Builder.new {
run DemoApp::Application
}.to_app

编辑:一个简单的例子来说明这一点:

class Builder
def initialize(&block)
instance_eval(&block)
end

def run(what)
puts "Running #{what}"
end
end

TOPLEVEL_BINDING.eval "Builder.new { run 10 }"

打印

Running 10

关于ruby - 了解 ruby TOPLEVEL_BINDING,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19784216/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com