クラスメソッドを持つモジュールを include

つい最近 Find というモジュールがあることを知った。んで、 refe で調べてみる。

% refe find
Enumerable#find Enumerable#find_all Find.find

typo したおかげで、Find.find ってその '.' は何ですか、という疑問が。

% refe Find
==== Find ====
# find.rb version 1.8

ディレクトリ配下のファイルを探索するためのモジュールです。
---- Singleton methods ----
find prune
---- Instance methods ----
---- Singleton methods (inherited) ----
---- Instance methods (inherited) ----

Singleton method とは、特異メソッドのことらしい。

そうか、Find.find は Find モジュールのクラスメソッドなのか。んで、クラスメソッドは Class クラスのインスタンス(これだと Find モジュール)の特異メソッドだ、と。ふむ。すっかり忘れてた。

なんとなく、 irb してみる。

leo:~% irb -rfind
irb(main):001:0> class Foo; include Find; end
=> Foo
irb(main):002:0> Foo.find
NoMethodError: undefined method `find' for Foo:Class
        from (irb):2
        from :0
irb(main):003:0> include Find
=> Object
irb(main):004:0> find('./')
LocalJumpError: no block given
        from /usr/lib/ruby/1.8/find.rb:39:in `find'
        from /usr/lib/ruby/1.8/find.rb:38:in `find'
        from (irb):4
        from :0

あれ、 include ってこういうものなんですか?

irb(main):005:0> class Foo; include Find; def find_in_Foo; find('./'); end; end
=> nil
irb(main):006:0> Foo.new.find_in_Foo
LocalJumpError: no block given
        from /usr/lib/ruby/1.8/find.rb:39:in `find'
        from /usr/lib/ruby/1.8/find.rb:38:in `find'
        from (irb):5:in `find_in_Foo'
        from (irb):6
        from :0

判ったような、そうでないような。とりあえず、あるクラスがモジュールを include する場合に、include されたモジュールのクラスメソッドは、include したクラスのクラスメソッドにはならない、ということは理解できた。

あー、なんかとんでもなくアホなことを書いてしまったかも。ま、いいや。