0

Rails 源代码包含此提交添加的这段代码,它启动了一个 rails 服务器:

  Rails::Server.new.tap do |server|
    # We need to require application after the server sets environment,
    # otherwise the --environment option given to the server won't propagate.
    require APP_PATH
    Dir.chdir(Rails.application.root)
    server.start
  end

我想知道为什么tap要使用方法。据我了解,tap旨在链接方法。但是,这里没有任何东西被束缚。另外,根据我的理解,它永远不会从server.start. 所以,这对我来说没有多大意义。

4

2 回答 2

2

不确定它是否完全回答了这个问题,但我相信这一点通常不仅仅是为文件中的任何旧范围定义一个“神秘”局部变量。相反,可以使用.tapwith 块为局部变量提供显式范围(因为局部变量在块的末尾从内存中删除)。所以他们可能只是想在这里定义范围(即“这里的代码只需要这个变量”)。

更新

这是我不久前读过的文章:http: //37signals.com/svn/posts/2144-scope-a-variable-to-a-block-in-your-template-code

于 2013-09-02T01:44:19.197 回答
2

我不确定这是不是原因,但它将变量限制server为该块的本地变量。这对代码的功能没有影响,因为server在其余代码中根本没有提到,但它有助于阅读代码:

server = Rails::Server.new
require APP_PATH
Dir.chdir(Rails.application.root)
server.start

具有相同的语义,但server在范围内。这使读者检查其余的代码,看看是否有其他东西在使用server. 在原始示例中,您知道只有这三行使用server,仅此而已。

于 2013-09-02T01:45:05.680 回答