RubyのModuleについて

アプリケーション

概要

RubyのModuleについてかく。

Moduleとは

クラスや他のモジュールに共通のメソッドや定数を提供するための仕組み。

# モジュール定義
module Hi
  def say_hi
    puts "Hi!"
  end
end

Moduleはクラスと異なり、インスタンス化できない。また継承もできない。

モジュールにはクラスメソッドやインスタンスメソッドを定義することができる。

クラスメソッドはモジュールのinclude先で呼び出すことができない。

module Greet
  # モジュールのクラスメソッド
  def self.hi
    puts "Hi!"
  end

  # モジュールのインスタンスメソッド
  def bye
    puts "Bye!"
  end
end

Greet.hi

class Speaker
  include Greet
end

speaker = Speaker.new
speaker.bye # => Bye!
speaker.hi # => NoMethodError

名前空間

名前空間を用意するために使うことができる。

module University
  class Student
    def self.say
      puts "I am a student"
    end
  end
end

class Student
  def self.say
    puts "私は学生です"
  end
end

Student.say # => 私は学生です
University::Student.say # => I am a student

Mixin

継承を用いずクラスにインスタンスメソッドを追加・上書きすることができる。

クラスは多重継承ができないが、ModuleのMixinにより多重継承を実現できる。


class Greet
  include Hi
end

puts Greet.new.say_hi # => Hi!

ちなみにMixinとTraitは似ているが、Mixinは継承を用いているのに対して、Traitは継承以外の様々方法によってもメソッドを合成することができるものであり、ややニュアンスが異なる。

cf. ja.wikipedia.org - Mixin cf. ja.wikipedia.org - トレイト

extendを使ったクラスへの特異メソッド追加

extendを使うことで、クラスに特異メソッドを追加することができる。

module Hi
  def hi
    puts "Hi!"
  end
end

class Greet; end

Greet.new.extend(Hi).hi # => Hi!

参考


関連書籍