Super.tap {} - 它是什么,有哪些用途?

21

我在一个 gem 中看到了这种写法,但不理解它的意图。我知道 tap 单独的作用,但为什么有人会调用 super.tap {} 而不是在 super 调用后正常地继续代码。

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个回答

30

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

如果这对你来说并不是非常有用,在此处查看更多示例

在这种情况下,也许您的问题需要一些上下文代码。super调用被当前方法覆盖的方法。您的代码来自哪个类和方法,它继承自哪个类? - dmnd

23

super.tap就是在super返回的对象上调用tap方法。用户dmnd已经很好地解释了tap的作用(为什么要点踩?)。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 可用于包装继承类中的方法,添加一些功能但保留结果。


你的最后一句话恰好解释了我正在寻找的内容。 - Jack Kinsella

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接