そもそもなぜmoduleを使う必要があるのか
(今回触れるのはこのqiitaで言うとメソッドの格納場所として使用するmoduleです)
いくつかの処理において重複しているような処理を抽出し切り出すことによって管理をしやすくするため
またRailsでは他言語で使用されているような多重継承が使えないためそれを実現させるためにも必要。
結論を先に
moduleをincludeすると、include先のクラスおよびmoduleにおいてインスタンスメソッドとして使用が可能になる またmoduleをextendするとinclude先のクラスおよびmoduleにおいてクラスメソッドとして使用が可能になる。 よくある使い方で`extend ActiveSupport::Concern`を include元のmoduleに記載すると 1つのモジュール内において簡単にインスタンスメソッドとクラスメソッドを定義できて、 呼び出す時も`include そのmodule`とすればok(※ActiveSupport::Concernを使用するメリットとしては他にもありますが最も恩恵が大きいと思うのはこれだと思うので)
試しに
rails cしたら簡単に試せるので。
例えば下記以外にextendでmoduleを呼び出したけど、インスタンスメソッドとしてやってみたらどうなるかとか
またその逆もそうだし。
自分はとりあえずこれやってみてなるほどとなったし、やってみることをおすすめ。
# Railsコンソールを起動 $ rails c # その場でmoduleを定義して試す > module Testable def hello "hello" end end # クラスを作ってincludeのケース試す > class TestInclude include Testable end > test = TestInclude.new > test.hello # => "hello" # 別のクラスを作ってextendのケース試す > class TestExtend extend Testable end > TestExtend.hello # => "hello" # Concernを使うケースも試せます > module TestConcern extend ActiveSupport::Concern def instance_hello "instance hello" end class_methods do def class_hello "class hello" end end end > class TestBoth include TestConcern end > TestBoth.class_hello # クラスメソッド > TestBoth.new.instance_hello # インスタンスメソッド
終わりに
よくあるサイトではextend ActiveSupport::Concern
を使用する意味が無駄な記述を減らせるみたいな書きっぷりで
よくわからなかったし、じゃあ試しにやってみようとなっても試し方がわからなくて消化不良で終わっていたので
これをやってみて良かったですね。
ちなみに参考例はclaudeに出してもらいました。
また一歩成長です。