Enumerableを考えてみてください。
これは、モジュールに含める必要がある場合の完璧な例です。クラスが を定義している場合、モジュール ( 、など)#each
を含めるだけで多くの利点が得られます。これは、モジュールを mixin として使用する場合の唯一のケースです。モジュールを含めるクラスで定義されたいくつかのメソッドに関してモジュールが機能を提供する場合です。これが一般的な唯一のケースであると主張できます。#map
#select
「静的」メソッドの定義に関しては、より良いアプローチは次のようになります。
module MyModule
def self.do_something
end
end
に電話する必要はありません#module_function
。私はそれが奇妙なレガシーなものだと思います。
これを行うこともできます:
module MyModule
extend self
def do_something
end
end
...しかし、モジュールをどこかに含めたい場合はうまく機能しません。Ruby のメタプログラミングの機微を理解するまでは避けることをお勧めします。
最後に、あなただけの場合:
def do_something
end
...グローバル関数としてではなく、プライベートメソッドとして終了しますObject
(Rubyには関数はなく、メソッドのみです)。2 つの欠点があります。まず、名前空間がありません。同じ名前の別の関数を定義すると、後で評価される関数が取得されます。第 2 に、 に関して機能を実装している場合#method_missing
、プライベート メソッドを使用すると、Object
それがシャドウされます。そして最後に、モンキーパッチObject
は単なる悪事です:)
編集:
module_function
次のように使用できますprivate
。
module Something
def foo
puts 'foo'
end
module_function
def bar
puts 'bar'
end
end
そうすれば、 を呼び出すことはできますが、 を呼び出すことはできSomething.bar
ませんSomething.foo
。この への呼び出しの後に他のメソッドを定義するとmodule_function
、それらも混在せずに使用できるようになります。
ただし、2つの理由で好きではありません。まず、モジュールが混在していて「静的」メソッドを持っているということは、少し危険に思えます。有効なケースがあるかもしれませんが、それほど頻繁ではありません。私が言ったように、私はモジュールを名前空間として使用するか、それを混在させるかのどちらかを好みますが、両方ではありません。
次に、この例でbar
は、 が混在するクラス/モジュールでも使用できますSomething
。self
メソッドが使用して混合する必要があるか、使用しないで混合する必要がないため、これがいつ望ましいかはわかりません。
module_function
メソッドの名前を渡さずに使用することは、使用するよりもかなり頻繁に使用されると思います。private
とについても同様protected
です。