rubyでのclassとmoduleの違い
class
インスタンス化できてメソッド定義できる
継承できる
インスタンス変数を持てる
オブジェクト指向の基本単位として状態(インスタンス変数)と振る舞い(メソッド)を持つ
用途
オブジェクト設計
Ruby内部では Class < ModuleになっていてModule が“振る舞いの基本単位”であり、Class はそこに “インスタンス生成・継承” を追加した特別版という扱いになっている。
しかしこれは実装上の都合であって、classとmoduleの概念は別物として捉えるのが適切
module
インスタンス化できないがメソッドを格納できる
継承できない
用途
メソッドを格納する(使うときはMixin include / extend / prepend)
名前空間として利用する
定数グループ
背景
rubyでは単一継承+Mixinという設計を選択している(多重継承を採用しない)
目的は「ダイヤモンド問題の回避」と「メソッド探索順の予測可能性」
これによってinclude/extend/prependでの線形の祖先チェーン(ancestors)でメソッド探索が明快になっている。