目的
- module(モジュール)について理解を深めるため
目次
- moduleについて
- moduleの呼び出し方について
- classに定義したメソッドとは異なる用途について
moduleについて
moduleを一言で表すと下記のようになります。
→ 「インスタンス化できないクラスのようなもの」
#####→ 「インスタンス化能力はないが、メソッドを格納できるもの」
一応、上辺だけ分かりました。人に聞かれたとき、この一言使えばいいぐらいに
moduleの定義式 |
---|
module モジュール名 end |
# モジュールのインスタンスは作成できない
shimada = Tamago.new # NoMethodError: undefined method 'new' for Tamago.Module
moduleの呼び出し方について
module定義の中では別のmoduleやclassを定義できる。
よって、名前空間として利用できます。
名前空間とは?
- 名前の衝突を避けるために使う概念です。
- プログラムが複雑になると、他の人が作成したクラス名やメソッド名と重複してしまう可能性がでてきます。
- モジュールを名前空間として使用することで重複を避けることができます。
名前空間を利用した呼び出し
同じ名前のクラス(Shimada)を異なるmoduleの中に定義した場合、ネストしたclassやmoduleは「::」を用いて参照します。
違うmoduleに書かれた同じclassを呼び出す
module Gyudon
class Shimada
def self.order
puts '牛丼注文'
end
end
end
module Katsudon
class Shimada
def self.order
puts 'カツ丼注文'
end
end
end
# 同じクラス名が2つある。その場合に
# 「::」を用いて参照する
Gyudon::Shimada # =>Gyudon::Shimada
Katsudon::Shimada # =>Katsudon::Shimada
Gyudon::Shimada.order # "牛丼注文"
Katsudon::Shimada.order # "カツ丼注文"
モジュールから直接メソッドを呼び出したい場合(2種類)
# class名と同じように始まりの文字は大文字を使います。
module Shimada
# 定数を定義
VERSION = 1.0
# 1: selfオブジェクトを使用する
def self.gyudon
puts "Gyudon!"
end
# 2: module_functionメソッドを使用する
def katsudon
puts "Katsudon!"
end
module_function :katsudon
end
# モジュールから直接メソッドを実行
Shimada.gyudon
Shimada.katsudon
# 定数にアクセスする場合
puts Shimada::VERSION
classに定義したメソッドとは異なる用途について
moduleに定義したメソッドとclassに定義したメソットでは用途が違います。
違いとしては以下の4つが挙げられます。
- 名前空間を作る
- moduleのメソッドをあるclassのインスタンスメソッドとして取り組む
- moduleのメソッドをあるオブジェクトの特異メソッド(クラスメソッド)として取り組む
- 特異メソッドやmodule関数を定義して使う
なぜ、上記のような用途なるかというとmoduleの特徴を知る必要があります。
moduleの特徴
- インスタンスを生成できない
- 継承できない
最後に
うまく書けなかったので、どんなものか特徴だけ書きました。
あと、書いてて思ったのはRubyについてもっと勉強しようと思った。
moduleとか他の言語でもあるし、根本的な知識が足りていないって気付かされたのが本当良かった。