DesignAssembler

備忘録に近い

respond_to?とself_respond_to?の違い

respond_to?

respond_to?メソッドはレシーバが使用可能なメソッドを調べるメソッドです。

これはRubyのビルトインメソッドです。

obj.respond_to?(name, private = false)

class Respond
def hello
  puts "hello"
end
end

> Respond.new.respond_to?(:hello)
true
> Respond.new.respond_to?(:goodmorning)
false

self_respond_to?

これはActiveRecord::ActsAsで宣言されているメソッドです。

ActiveRecord::ActsAsはActiveRecordを拡張してMTIを実装しています。

レポジトリは以下です。respond_to?は96行目〜にあります。

github.com

      def respond_to?(name, include_private = false, as_original_class = false)
        as_original_class ? super(name, include_private) : super(name, include_private) || acting_as.respond_to?(name)
      end

      def self_respond_to?(name, include_private = false)
        respond_to? name, include_private, true
      end

respond_to?を拡張してself_respond_to?を作っています。

自作クラスでrespond_to?を使う場合とRuby標準のrespond_to?を使う場合とで使い分けたかっただけのようです。

結論

respond_to?とself_respond_to?に大きな違いはありません。

ActiveRecord::ActsAsを使わない限りself_respond_to?を意識することはないように思われます。

参考

ref.xaio.jp