Ruby is going to introduce new method Kernel#yield_self [Feature #6721] since the version 2.5.0, so let’s take a look at it.

Kernel#yield_self works similarly to the method Object#tap, but they return different values.

Object#tap yields self to the block and then returns self. The primary purpose of this method is to “tap into” a method chain, in order to perform operations on intermediate results within the chain.

Example:

(1..10)                   .tap { |x| puts "original: #{x}" }
  .to_a                   .tap { |x| puts "array:    #{x}" }
  .select { |x| x.even? } .tap { |x| puts "evens:    #{x}" }
  .map { |x| x*x }        .tap { |x| puts "squares:  #{x}" }
# => original: 1..10
# => array:    [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
# => evens:    [2, 4, 6, 8, 10]
# => squares:  [4, 16, 36, 64, 100]

Kernel#yield_self yields self to the block and then returns the result of the block execution.

Example:

User = Struct.new(:name, :sex) do
  def male?
    sex == "male"
  end
end

user = User.new("Bogdan", "male")

user.yield_self { |u| u.male? ? "Mr. #{u.name}" : "Ms. #{u.name}" } # => "Mr. Bogdan"
user.yield_self { |u| "Hi, #{u.name.upcase!}" } # => "Hi, BOGDAN"
user.name # => "BOGDAN"