Super.tap {} - 它做什么和用例?

Jac*_*lla 17 ruby

我在一个宝石中遇到了这个结构并且不明白其意图.我知道单独使用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
Run Code Online (Sandbox Code Playgroud)

任何人都可以开导我吗?

dmn*_*mnd 29

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
Run Code Online (Sandbox Code Playgroud)

可以替换为

def make_a_something
  Something.new.tap do |t|
    t.method
    t.attr = 'foo'
  end
end
Run Code Online (Sandbox Code Playgroud)

如果这不会让您觉得非常有用,请在此处查看更多示例.


Mla*_*vić 22

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
Run Code Online (Sandbox Code Playgroud)

本质上,super.tap可以用于从继承的类包装方法,添加一些功能,但保留结果.