Object#acts_like?(ActiveSupport)
https://github.com/rails/rails/blob/master/activesupport/lib/active_support/core_ext/object/acts_like.rb クラスに`acts_like_xxxx?`というメソッドを定義しておくことで、安全にダックタイピングできるようになります。 例えば、ActiveSupportによってDateには`acts_like_date?`メソッドが、Timeには`acts_like_time?`メソッドが拡張されています。 ```ruby require 'active_support/core_ext/object/acts_like' Date.new.acts_like? :date # => true Date.new.acts_like? :time # => false DateTime.new.acts_like? :date # => true DateTime.new.acts_like? :time # => true ``` ```ruby require 'active_support/core_ext/object/acts_like' class Car def acts_like_car?; true; end def drive puts '走行します' end end class Boat def acts_like_boat?; true; end def sail puts '航行します' end end class AmphibianCar < Car def acts_like_boat?; true; end def sail puts '水中走行します' end end def run(vehicle) if vehicle.acts_like?(:car) vehicle.drive end if vehicle.acts_like?(:boat) vehicle.sail end end run Car.new # => 走行します run Boat.new # => 航行します run AmphibianCar.new # => 走行します # => 水中走行します ``` Twitterの反応
activesupportのacts_like?ってもっと活用方法ないのかな。
— 北市真 (@KitaitiMakoto) 2013, 5月 21
@tkawa ロガーに共通のメソッドを備えていたらacts_like? :logger、配列っぽかったらacts_like? :array(XMLのNodeSetなど)とは考えたんですが、普通にrespond_to?で判定するのとどっちが楽か分からなくなりました。
— 北市真 (@KitaitiMakoto) 2013, 5月 22
@KitaitiMakoto acts_like? :array はありかも、と思ったけどやっぱり is_a? Enumerable のほうがよさそうだし、ダックタイピングにうまくはまりそうな例が難しいですね...。
— Toru KAWAMURA (@tkawa) 2013, 5月 22
個人的には、`respond_to?`で単にあるメソッドがあるか調べるのに比べて、コードの意図が明確になると思います。