@ledsun blog

無味の味は佳境に入らざればすなわち知れず

RubyでBasicObjectを継承しつつ、Objectの一部のメソッドをつかうには

RubyではほとんどのクラスはObjectクラスを継承しています。 極まれにObjectクラスの機能が多すぎることがあります。 そういうときはBasicObjectを継承します。 しかし、Objectの一部の便利なメソッドだけは使いたい。 そういうわがままな要望があります。

そんなときにActiveRecord::Promiseの実装が参考になります。

https://github.com/rails/rails/blob/5c0b7496ab32c25c80f6d1bdc8b32ec6f75ce1e4/activerecord/lib/active_record/promise.rb#L40-L42

    [:class, :respond_to?, :is_a?].each do |method|
      define_method(method, ::Object.instance_method(method))
    end

おまけ

「なんでActiveRecord::PromiseはBasicObjectを継承しているのだろう?」と思ってコミット履歴を見てみました。

PoC: Active Record API for general async queries · rails/rails@03e435b · GitHub

byrootさんが最初にコミットした時点でBasicObjectを継承していました。 なにそれ?すごい。