Итератор 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}