WEBサービス創造記

WEBサービスを作ったり保守したりしてる人のメモブログです。

RubyのModuleについて復習

      2015/01/12

Moduleの概要

Classがプロパティ(データ)とメソッド(処理)を持った「もの」を表現する機能であるのに対し、Moduleはメソッドの部分だけをまとめる機能。
他にもClassとは以下が異なる。

  • Moduleからはインスタンスを生成できない
  • Moduleは継承できない

Moduleの使い方

名前空間の提供

名前空間はメソッドや定数、クラスの名前を区別して管理する単位のことで、Moduleは名前空間の提供を行う。
例えば、AというModuleのfooというメソッドはBというModuleのfooというメソッドは別のものとして扱われる。定数の場合も同様。

したがって、sizeやname,startなどの予約後に該当しそうな命名を行いたい場合にModule内で行うと無難。

Moduleの提供するメソッドは、「Module名.メソッド名」で実行できる。
ただし、このような書式で実行させるには予めModule内で「module_function :メソッド名」という宣言を行う必要がある。

module Greet
  def hello
    "Hello"
  end

  module_function :hello
end
irb> require "greet"
irb> Greet.hello => "Hello"

Module内で定義されたメソッド(例えば上記ではhello)と同名のものが定義されていない場合は、ModuleをincludeすることによってModule名を省略することができる。

irb> include Greet
irb> hello => "Hello"

Mix-in

ModuleをClassに混ぜ合わせることをMix-inという。
Class定義の中でModuleをincludeすると、Moduleで定義されたメソッドや定数を使うことができる。
つまり、Mix-inとはClassにModuleをincludeすることである。

例えば、HogeというClassでGreetというModuleをMix-inするには以下のようにする(※1)。

require "greet"

class Hoge
  include Greet

  def greet(to: "unknown")
    "#{hello}, #{to}"
  end
end
irb> require "hoge"
irb> hoge = Hoge.new
irb> hoge.greet(to: "someone") => "Hello, someone"

参考資料

たのしいRuby 第3版

備考

※1

Mix-inの場合はデフォルトでprivateメソッドとして読み込まれる。
したがって、以下はエラーとなる。

    require "greet"

    class Hoge
      include Greet
    end
    
    irb> require "hoge"
    irb> hoge = Hoge.new
    irb> hoge.hello => "Hello"
    NoMethodError: private method `hello' called for #<Hoge:0x0000000108ddc8>
    

 - Ruby , , , ,