Super.tap {} - что он делает и использует варианты? - PullRequest
17 голосов
/ 24 февраля 2011

Я наткнулся на эту конструкцию в драгоценном камне и не понимаю намерения. Я знаю, что делает 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

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

Ответы [ 2 ]

28 голосов
/ 24 февраля 2011

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

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

21 голосов
/ 24 февраля 2011

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для переноса метода из унаследованного класса, добавления некоторых функций, но сохранения результата.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...