【一人 Ruby Advent Calendar 2017】クラスとモジュールの違い【7日目】

一人 Ruby Advent Calendar 2017 7日目の記事になります。
今回はクラスとモジュールの違いを簡単にまとめてみました。

クラス

  • class でクラスを定義
  • .new でクラスのインスタンスオブジェクトを生成
  • 異なるクラスを継承する事が出来る
  • クラスは1つのクラスしか継承する事ができない
  • クラスを mixin することはできない

Ruby のクラスは『任意のインスタンスを生成する為』のオブジェクトとして定義します。

# クラスの定義
class Person
    attr_accessor :name, :age

    def initialize name, age
        self.name = name
        self.age  = age
    end

    def to_s
        "name:#{name}, age:#{age}"
    end
end

# クラスのインスタンスオブジェクトを生成
homu = Person.new "homu", 14
mami = Person.new "mami", 15

puts homu
# => name:homu, age:14

puts mami
# => name:homu, age:14

モジュール

  • module でモジュールを定義
  • モジュールはインスタンス化できない
  • include などを使用することで任意のクラスやモジュールに対して mixin することが出来る
  • mixin は何個でも出来る
  • モジュールは継承できない

定義したモジュールを mixin することでそのモジュールのメソッドを使用することができます。

module Twice
    def twice
        self + self
    end
end


class X
    # モジュールを取り込む
    include Twice

    attr_reader :value

    def initialize value
        @value = value
    end

    def + other
        X.new(value + other.value)
    end

    def to_s
        @value.to_s
    end
end


x = X.new 42

# mixin したモジュールのメソッドが使用できる
puts x.twice
# => 84

puts x.twice.twice
# => 168

まとめ

  • クラスはインスタンス化出来る
  • モジュールはインスタンス化できない
  • クラスは継承して拡張できる
  • モジュールは mixin することで機能を取り込むことが出来る


こんな感で Ruby におけるクラスとモジュールは似ているようで違い、違っているようで似ている感じになります。
使い分けるコツとしては

  • インスタンスオブジェクトを生成したい場合はクラス
  • 機能として切り出したい場合はモジュール

というような感じでしょうか。