Rubyのモジュールの特異メソッド定義する方法いろいろ

モジュールに特異メソッドを定義する方法はいろいろあるけど、それぞれ違いがあるのでまとめた。

普通にメソッドとして定義しておいて、あとから extend self するというちょっとトリッキーなやりかた。 mitukiii のひとが使ってるの見て知った

module_function を使うやり方。これも mitukiii の人経由で知った。

普通に class << self で特異クラスをオープンしてそこに定義するやりかた。

def self.some_method のやり方は普通なので今回は取り上げない。

extend self するやり方だと、そのモジュールをincludeしたクラスに対して外からも見える副作用が生まれる。のでこのやり方はそれを狙っているのでない限りあまり推奨されないとわたしは感じる。

module_function を使うと、そのメソッドがモジュール関数になる。"モジュール関数とは、プライベートメソッドであると同時に モジュールの特異メソッドでもあるようなメソッド" ( http://doc.ruby-lang.org/ja/1.9.3/method/Module/i/module_function.html ) とのこと。外から見える副作用は生まれないけど、プライベートメソッドとしても定義されるのでこの Module を include したクラスには副作用を与える。

下のやりかたになればなるほど副作用がない。単純に static な手続きを名前空間上にまとめて定義したいみたいな用途のためには 一番下の素直なやり方が合ってるとわたしは思う。