I've found this piece of code in a pull request someone made to one of my 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
The idea is getting a remote Excel file with HTTParty and then write it to a Tempfile for reading its data. Nothing fancy and it is working fine.
But I'm not very used to Ruby Tempfile and then I decided to read its documentation in order to learn more about it. But I haven't found a #tap
method there.
Then I tried the File documentation and then again I could find nothing about #tap
.
Where is this method defined?
What is it for?
Thanks in advance!
#tap
is defined on Object
https://ruby-doc.org/core-2.3.1/Object.html#method-i-tap
It was introduced in Ruby 1.9. It yields self to the block and then returns self. I think an illustrative example is when it's used to return an object from a method.
You could do this.
def foo
a = []
a.push(3)
a
end
def foo
[].tap do |a|
a.push(3)
end
end
In the first example the array a is returned explicitly and in the second tap is being used to yield the block to self and then return self.