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
Может кто-нибудь просветить меня?
Ответы
Ответ 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
Если это не ударит вас как ужасно полезное, см. некоторые дополнительные примеры здесь.