This is the first I've heard of Object#tap.  It seems backward because
you almost always want the result of the block, not the object back
again.  All of my ruby scripts use

   class Object
      def as
         yield self
      end
   end

E.g, a recent script of mine does

   platform_audio_files = audio_stems.map { |f|
      f + "." + audio_ext[platform]
   }.as { |t|
      t + audio_basenames
   }.map { |f|
      File.join(audio_dir, f)
   }

I know this could be written

   platform_audio_files = (audio_stems.map { |f|
      f + "." + audio_ext[platform]
   } + audio_basenames).map { |f|
      File.join(audio_dir, f)
   }

but I find that uncouth compared to the former.

If ruby is adding anything, it should be the behavior of Object#as,
not Object#tap.