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

时间:2011-02-24 11:01:34

标签: 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

任何人都可以启发我吗?

2 个答案:

答案 0 :(得分:28)

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

如果这不会让你觉得非常有用,see some further examples here

答案 1 :(得分:21)

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可用于从继承的类中包装方法,添加一些功能,但保留结果。