开发者

Super.tap {} - what does it do and use cases?

I came across this construction in a gem and don't understand the 开发者_开发技巧intent. I know what tap does alone, but why would someone call super.tap {} instead of just continuing the code normally after the super call.

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

Can anyone enlighten me?


tap is used to perform some operations on an object, and then return that object. That sounds confusing, but it's helpful when chaining methods. Example:

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

can be replaced with

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

If that doesn't strike you as terribly useful, see some further examples here.


super.tap is nothing but tap method called on whatever super returns. User dmnd already explained pretty well what tap does (why the downwote?). super calls the method from the ancestor class which you are overriding.

So, the code you pasted is equivalent with the following:

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

Essentially, super.tap can be used for wrapping the method from the inherited class, adding some functionality, but keeping the result.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜