Ruby Tempfile#tap:什么 class 定义了这个方法,它有什么用?

Ruby Tempfile#tap: What class defines this method and what is it for?

我在某人对我的一个 gems 提出的拉取请求中找到了这段代码:

source = HTTParty.get(PoliticosBR::DEPUTADOS_URL)
tempfile = Tempfile.new('deputados.xls').tap do |f|
  f.write(source.to_s.force_encoding('UTF-8'))
end

想法是使用 HTTParty 获取远程 Excel 文件,然后将其写入临时文件以读取其数据。没什么特别的,它工作正常。

但我不太习惯 Ruby Tempfile,然后我决定阅读 its documentation 以了解更多信息。但是我还没有在那里找到 #tap 方法。

然后我尝试了 File documentation 然后我又找不到关于 #tap 的任何信息。

这个方法在哪里定义的?

它有什么用?

提前致谢!

#tap 是在 Object

上定义的

https://ruby-doc.org/core-2.3.1/Object.html#method-i-tap

它是在 Ruby 1.9 中引入的。它让出 self 到块,然后 returns self。我认为一个说明性的例子是当它用于 return 来自方法的对象时。

你可以做到这一点。

def foo
  a = []
  a.push(3)
  a
end

def foo
  [].tap do |a|
    a.push(3)
  end
end

在第一个示例中,数组 a 被显式 return 编辑,在第二个 tap 中被用于将块生成给 self,然后 return self。