Classでmodule_functionをundefしているのは何故?
Classでmodule_functionをundefしているのは何故?
そのクラス専用で、インスタンスは参照しないサポート的な関数を、外部からも使いたい。
たとえば、ちょっとした変換を行うサポートメソッド。
変換前のデータを受け入れて内部で変換するメソッド(pre_data=)と、変換後のデータを受け入れるメソッド(post_data=)と、変換メソッド(henkan)。
標準変換でよければ、変換前のデータを受け入れる pre_data= メソッドを使う。
非標準変換で変換した場合には、変換後のデータを受け入れる post_data= メソッドを使う。
非標準的な変換メソッドの内部で、デフォルトの変換メソッドも使いたい。
foo = Foo.new foo.pre_data = "henkan mae" foo.post_data = "henkan go" Foo.henkan("henkan mae") #=> "henkan go"
対策としては?
(a)モジュールを別に作ってincludeするという方法
これでは、クラス名ではなくモジュール名で呼び出すことになる。クラスとの関連を明確にしたい。
(b)クラスメソッドにして self.class.support_func で呼び出す。
(c)クラスメソッドで中身を作り、もう一つインスタンスメソッドを作ってクラスメソッドを呼び出す。
これでやっているのだが、なんとなく、腑に落ちない。Module にある module_function に相当するものが何故、Classには無いのだろうか?
(d)Classクラスでのmodule_functionのundefに文句を言う。
−−−−
module_function の動作
#! ruby -Ks module Bar # 普通のメソッド def foo_1 p :foo_1 end # モジュール関数 def foo_2 p :foo_2 end module_function :foo_2 # モジュールの特異メソッド def self.foo_3 p :foo_3 end end class Foo include Bar def bar # Bar.foo_1 # undefined method `foo_1' for Bar:Module Bar.foo_2 # OK .. module_function はモジュールの特異メソッドになるから Bar.foo_3 # OK .. モジュールの特異メソッドだから。 self.foo_1 # OK。(↓)はNG、モジュール関数はインスタンスのプライベートメソッドになるから # self.foo_2 # private method `foo_2' called for #<Foo:0x1322020> # self.foo_3 # undefined method `foo_3' for #<Foo:0x13221b0> foo_1 # インスタンスメソッドだから foo_2 # インスタンスメソッドだから # foo_3 # undefined local variable or method `foo_3' for #<Foo:0x13213c8> end end Foo.new.bar #Bar.foo_1 # undefined method `foo_1' for Bar:Module Bar.foo_2 # OK Bar.foo_3 # OK #Foo.foo_1 # undefined method `foo_1' for Foo:Class #Foo.foo_2 # undefined method `foo_2' for Foo:Class #Foo.foo_3 # undefined method `foo_3' for Foo:Class