2011-02-24 10 views
16

Me encontré con esta construcción en una joya y no entiendo la intención. Sé lo que hace el grifo solo, pero ¿por qué alguien llama a super.tap {} en lugar de simplemente continuar el código normalmente después de la súper llamada.Super.tap {} - ¿qué hace y usa casos?

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 

¿Alguien me puede aclarar?

Respuesta

20

super.tap es nada más que tap método llamado en lo que super devuelve. El usuario dmnd ya explicó bastante bien qué hace tap (¿por qué el downwote?). super llama al método de la clase antecesora que está anulando.

Por lo tanto, el código que ha pegado es equivalente a lo siguiente:

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 

Esencialmente, super.tap se puede utilizar para envolver el método de la clase heredada, añadiendo algunas funciones, pero manteniendo el resultado.

+0

Downvote fue un error. ¡Ha sido rectificado! –

+0

Su última oración explica exactamente lo que estoy buscando. –

27

tap se utiliza para realizar algunas operaciones en un objeto, y luego devolver ese objeto. Eso suena confuso, pero es útil cuando se usan métodos de encadenamiento. Ejemplo:

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

se puede sustituir por

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

Si eso no le parece que sea terriblemente útil, see some further examples here.

+0

En ese caso, tal vez su pregunta necesite algo del código circundante para el contexto. super llama al método que se reemplaza por el método actual. ¿De qué clase y método es su código y de qué clase hereda? – dmnd

Cuestiones relacionadas