我在一个宝石中遇到了这个结构并且不明白其意图.我知道单独使用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可以用于从继承的类包装方法,添加一些功能,但保留结果.
| 归档时间: |
|
| 查看次数: |
3823 次 |
| 最近记录: |