What does the tap method do in Ruby?
Object#tap
yields the object it is called upon to a block but the resulting value is the value of the object (not the value of the block). For example:
> 1.tap { |obj| puts obj * 2 }
2
=> 1
The value 1
is passed to the block where we output the result of obj * 2
(2). However, the value of the expression is the value of the object: 1.
Say we have a User
class:
class User
attr_accessor :name
end
To create a new user, we might do something like this:
def user
new_user = User.new
new_user.name = @name
new_user
end
The return value of the above method is a new user object with its name assigned to the value of @name
.
You can see we have to create the temporary variable new_user
to hold the value of the new user in order for us to assign its name. We then return the value of the temporary variable.
#tap
removes the need for the temporary variable.
def user
User.new.tap { |obj| obj.name = @name }
end
In the above example, we call #tap
on the newly instantiated user object. Inside the block, we assign a name to the new user. The resulting value is the newly instantiated user object with its name assigned the value of @name
.