タケユー・ウェブ日報

Ruby on Rails や Flutter といったWeb・モバイルアプリ技術を武器にお客様のビジネス立ち上げを支援する、タケユー・ウェブ株式会社の技術ブログです。

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の反応

個人的には、`respond_to?`で単にあるメソッドがあるか調べるのに比べて、コードの意図が明確になると思います。