【一人 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
まとめ
こんな感で Ruby におけるクラスとモジュールは似ているようで違い、違っているようで似ている感じになります。
使い分けるコツとしては
- インスタンスオブジェクトを生成したい場合はクラス
- 機能として切り出したい場合はモジュール
というような感じでしょうか。