我在宝石中遇到了这个结构,并不理解其意图。 我知道单独使用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
任何人都可以启发我吗?
答案 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
可用于从继承的类中包装方法,添加一些功能,但保留结果。