クラスメソッドを持つモジュールを 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 したクラスのクラスメソッドにはならない、ということは理解できた。
あー、なんかとんでもなくアホなことを書いてしまったかも。ま、いいや。