考えてみてくださいEnumerable。
これはモジュールに組み込む必要がある場合の完全な例です。あなたのクラスが#each
を定義している場合は、モジュール(#map
、#select
など)を含めるだけで、多くの利点が得られます。これは、モジュールをmixinとして使用する唯一のケースです。モジュールがいくつかのメソッドの面で機能を提供するとき、それをモジュールに含めます。私はこれが一般的な唯一のケースであるべきだと主張することができます。 「静的」メソッドを定義するよう
、より良いアプローチは次のようになります。あなたは本当に#module_function
を呼び出す必要はありません
module MyModule
def self.do_something
end
end
。私はそれが単なる奇妙な遺産だと思う。
module MyModule
extend self
def do_something
end
end
を...しかし、あなたはまた、どこかのモジュールを含める場合、それはうまく動作しません。
あなたも、これを行うことができます。あなたがRubyメタプログラミングの微妙なことを学ぶまでは避けることをお勧めします。
最後に、あなただけ行う場合:
def do_something
end
は...それはグローバル関数として終わることはありませんが、
Object
のプライベートメソッドとして(何の機能は、Rubyでちょうど方法はありません)。 2つの欠点があります。まず、名前空間がありません。同じ名前の別の関数を定義すると、それは後で評価されます。第二に、
#method_missing
の機能を実装している場合は、
Object
にプライベートメソッドを設定すると、それがシャドーされます。そして最後に、
Object
にパッチを適用猿はただ悪ビジネスです:)
EDIT:
module_function
がprivate
と同様の方法で使用することができます。
module Something
def foo
puts 'foo'
end
module_function
def bar
puts 'bar'
end
end
そのように、あなたはSomething.bar
を呼び出すことはできませんが、ないSomething.foo
。この呼び出しの後に他のメソッドを定義した場合、それらは混在することなく利用できます。
私は2つの理由でそれを好きではありません。第一に、混在していて、静的な方法を持っているモジュールは少しばかげて聞こえます。妥当なケースがあるかもしれませんが、それほど頻繁ではありません。私が言ったように、私はモジュールを名前空間として使うか、それを混在させる方が好きですが、両方ではありません。
第2に、bar
は、Something
に混在するクラス/モジュールでも使用できます。この方法が望ましいかどうかわからないのは、メソッドがself
を使用していて、混在する必要があるか、または混在する必要がないからです。メソッドの名前は、より頻繁に使用されます。 private
とprotected
についても同じです。
説明のためにありがとう。私はなぜあなたがモジュールで混在したいと思うのか理解しています。私の質問は実際にmodule_functionを実際に使用するかもしれないときです。あなたが実際にそれを使うかもしれませんか? –
最後の例では、 'module_function'を使ってもう1つのキャッチがあります:' foo'はインスタンスメソッドです( 'self'はありません)ので、' private'関数 'foo'は' bar'の内部からアクセスできません。このモジュールがいくつかのクラスで混在している場合にのみ呼び出すことができます。ネームスペースの目的のためだけにスタンドアロンのモジュールである場合は不可能です。それで、どうやって両方持っているの?モジュールを名前空間に使用する方法と、外部から実装ヘルパー関数を隠す方法はありますが、それらをインターフェイスメソッドで呼び出すことはできますか? – SasQ