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