備忘録的な何か

技術ブログ的な何かです

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