改变版本的tap – 或管道表达式的方法?
tap
会将self
传递给传递给它的块,并返回self
不变。 我经常发现自己希望有一个版本的tap
返回块的返回值,而不是self
。 例如:
[1,2].inject(:+).tap {|x| x * 3} #=> returns 3, but I want 9
是否有任何内置方法可以实现这一目标?
典型的解决方案 – 创建一个临时局部[1,2].inject(:+)
来存储[1,2].inject(:+)
的输出,并将其乘以3 – 看起来像kludgy。
没有内置方法,但您可以从Ruby Facets添加Kernel#ergo
#ergo :
"a".ergo.upcase #=> "A" nil.ergo.foobar #=> nil "a".ergo { |o| o.upcase } #=> "A" nil.ergo { |o| o.foobar } #=> nil
这就像#tap,但#tap会产生self并返回self,而#ergo会产生self但会返回结果。
你可以自己做。
class Object def my_tap return yield self if block_given? self end end [1,2].inject(:+).my_tap {|x| x * 3} => 9