memo.log

技術情報の雑なメモ

【Ruby】モジュールで定義されたメソッドをクラスメソッドにするときのメモ

require 'active_record'

module Test1
  def hoge
    "hoge1"
  end
end

module Test2
  def hoge
    "hoge2"
  end
end

module Test3
  extend ActiveSupport::Concern

  module ClassMethods
    def hoge3
      "hoge3"
    end
  end
end

class Test
  extend Test1
  extend Test2 # 後ろで定義されたモジュールが使われる
  include Test3
end

pp Test.hoge # => "hoge2"
pp Test.method(:hoge).source_location # ["test.rb", 8]
pp Test.hoge3

................

require 'active_record'

module M1
  extend ActiveSupport::Concern

  def config(key:)
    # この変数は include したクラスで参照可能
    @key = key
  end

  def instance_test1
    "instance_test"
  end

  module ClassMethods
    def class_test1
      "class_test1"
    end
  end
end

module M2
  def class_test2
    "class_test2"
  end
end

class Test
  include M1
  extend M2
end


pp Test.new.instance_test1 # "instance_test"
pp Test.class_test1 # "class_test"
pp Test.class_test2 # "class_test"