当我使用Sinatra作为Rack中间件时,我可以在我的Rackup文件中执行此操作:
use MyGloriousApp.new do | le_app |
le_app.settings.set :frobnicate, true
end
当我需要在中间件末尾使用run
块时,如何完成相同的操作
链?像
run MyGloriousApp.new do | le_app |
le_app.settings.set :frobnicate, true
end
答案 0 :(得分:4)
这是由创建块时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
该块将传递给run
方法,而不是您想要的应用程序构造函数。
解决此问题的一种方法(也说明了正在发生的事情)是使用括号将块与构造函数显式关联:
run(MyGloriousApp.new do | le_app |
le_app.settings.set :frobnicate, true
end)
{...}
语法的优先级高于do...end
,并绑定到其左侧最近的方法调用,因此您也可以这样做:
run MyGloriousApp.new { | le_app |
le_app.settings.set :frobnicate, true
}
在这种情况下,该块与调用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,所以它被忽略了。
答案 1 :(得分:2)
就像这样写:
app = LeApp.new
app.settings.set :frobnicate, true
run app