元フリーエンジニアライフ

Ruby on Rails とか MovableType とかAWSやってるフリーランスウェブエンジニアの記録でした。現在は法人成りしてIT社長。

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?`で単にあるメソッドがあるか調べるのに比べて、コードの意図が明確になると思います。