gpt4 book ai didi

ruby - 从 config.ru 设置 Sinatra 应用设置

转载 作者:数据小太阳 更新时间:2023-10-29 07:50:03 26 4
gpt4 key购买 nike

当我使用 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/

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