当我使用 Sinatra 作为 Rack 中间件时,我可以在我的 Rackup 文件中这样做:
use MyGloriousApp.new do | le_app |
le_app.settings.set :frobnicate, true
end
当我需要中间件末尾的 run
block 时,我该如何完成相同的操作
链?有点像
run MyGloriousApp.new do | le_app |
le_app.settings.set :frobnicate, true
end
最佳答案
这是由创建 block 时 do ...end
语法的优先级引起的。你的例子:
run MyGloriousApp.new do | le_app |
le_app.settings.set :frobnicate, true
end
相当于:
run(MyGloriousApp.new) do | le_app |
le_app.settings.set :frobnicate, true
end
block 被传递给 run
方法,而不是像您预期的那样传递给应用程序的构造函数。
解决此问题的一种方法(这也说明了正在发生的事情)是使用括号将 block 与构造函数显式关联:
run(MyGloriousApp.new do | le_app |
le_app.settings.set :frobnicate, true
end)
{...}
语法的优先级高于 do...end
并绑定(bind)到其左侧最近的方法调用,因此您也可以这样做这个:
run MyGloriousApp.new { | le_app |
le_app.settings.set :frobnicate, true
}
在这种情况下, block 与调用 MyGloriousApp.new
而不是 run
相关联。
do...end
语法与use
方法一起工作的原因是 use
passes the block through to the middleware’s constructor . run
doesn’t do anything with any block passed , 所以它被忽略了。
关于ruby - 从 config.ru 设置 Sinatra 应用设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21229508/