改变版本的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