Kopo4e

Итератор tap

Можно использовать в  цепочке методов, например для вывода промежуточных результатов.

a = [1, 2, 3, 1, 5, 2, 6, 7, 3, 9, 1, 8, 2]

a.tap { |x| p x } # => [1, 2, 3, 1, 5, 2, 6, 7, 3, 9, 1, 8, 2]
.sort
.tap { |x| p x }  # => [1, 1, 1, 2, 2, 2, 3, 3, 5, 6, 7, 8, 9] 
.uniq
.tap { |x| p x }  # => [1, 2, 3, 5, 6, 7, 8, 9]
.map { |x| x*2 }  # => [2, 4, 6, 10, 12, 14, 16, 18]

Можно использовать, когда нужно модифицировать объект внутри блока.

params = { pages: 10 }

# before
def without_tap(params)
  params[:sort] = :asc
  params
end
without_tap(params) #  => {:pages=>10, :sort=>:asc} 

# after
def with_tap(params)
  params.tap { |p| p[:sort] = :desc }
end
with_tap(params) #  => {:pages=>10, :sort=>:desc}