tapを使って配列じゃなくてもeachする方法
処理対象がEnumerableな要素かそうでないかわからない時ってよくありますよね。
ActiveRecordなんかもそうですが、1要素の時は単体のオブジェクトがきて、複数要素の時はEnumerableが来るapiってわりとあります。(scanとかもそう。)
で、tapを使えばそれを解決できますよという話。
http://melborne.github.io/2012/10/29/rubys-new-control-structure-by-tap-and-break/
上記サイトがすべてを物語っていますが、tapの中でbreakを使うと、その値が返り値になることを利用します。
hoge.tap{|s| break [s] unless s.respond_to?(:each)}.each{|x| puts x}
#hogeは配列かどうかわからないが配列として扱いたい
まあ、tapを使わなくても普通に定義できます。
module Kernel
def wrap_a
self.respond_to?(:each) ? self : [self]
end
end
1.wrap_a.each{|x| puts x} # 1をeach