Подтвердить что ты не робот

Super.tap {} - что он делает и использует случаи?

Я наткнулся на эту конструкцию в драгоценном камне и не понимаю намерения. Я знаю, что касается одного, но почему кто-то вызовет super.tap {} вместо обычного кода после супервызов.

def my_method
 super.tap do |u|
    if @user && @user.new_record?
      @omniauth = u.session[:session]
      u.session[:omniauth] = nil unless @user.new_record?
    end
  end
end

Может кто-нибудь просветить меня?

4b9b3361

Ответ 1

super.tap - это не что иное, как tap метод, вызванный тем, что возвращает super. Пользователь dmnd уже довольно хорошо объяснил, что делает tap (почему downwote?). super вызывает метод из класса предков, который вы переопределяете.

Итак, введенный вами код эквивалентен следующему:

original_result = super
if @user && @user.new_record?
  @omniauth = original_result.session[:session]
  original_result.session[:omniauth] = nil unless @user.new_record?
end
return original_result

По существу, super.tap можно использовать для переноса метода из унаследованного класса, добавляя некоторые функции, но сохраняя результат.

Ответ 2

tap используется для выполнения некоторых операций над объектом, а затем возвращает этот объект. Это звучит сбивает с толку, но полезно при использовании методов цепочки. Пример:

def make_a_something
  t = Something.new
  t.method
  t.attr = 'foo'
  t # must remember to manually return t, otherwise 'foo' is returned
end

можно заменить на

def make_a_something
  Something.new.tap do |t|
    t.method
    t.attr = 'foo'
  end
end

Если это не ударит вас как ужасно полезное, см. некоторые дополнительные примеры здесь.