特定のメソッドが定義されていない場合、エラーをスローするモジュールにいくつかのコードを入れたいと思います。 このモジュールの実装はすべてのクラスで異なるため、このモジュールはこのメソッドの外部定義に依存しています。このコードは、開発者がモジュールの機能を使用しようとするよりもむしろメソッドを実装するのを忘れてしまったことを早期に知るのに役立ちます。メソッドが定義されていない場合Ruby:クラスメソッドが見つからない場合、モジュールでエラーが発生する
module MyModule
def self.included(klass)
raise "MyModule: please `def my_method` on #{klass}" unless klass.respond_to?(:my_method)
end
end
は、私は簡単に、それは私の必要なメソッドは、クラスで定義されている可能性があります、ほとんどのモジュールは、ファイルの先頭に含まれているがために、モジュールの付属の定義でエラーを発生させることができます私のモジュールが含まれる前ではありません。
class MyClass
include MyModule
def self.my_method
# ...
end
end
これはまだエラーを引き上げる:(
は、それは方法が真にクラス定義で定義されていない場合にのみ、エラーが発生することは可能ですか?ほとんどの種類のclass.onloadコールバックを必要としています。場合あなたはmethod_missing
とdefine_method
を利用したい好きではない、プログラマはこの必要なメソッドを定義することなく、当社のモジュールが含まれる場合があります?
私は固有クラスに精通しています。はい、静的メソッドチェックのようなことをしようとしています。私の同僚の一人は、この期待をMyModuleを実装するモデルのテストに移行できると指摘しました。私たちは、すべてのモデルのテスト/スペックとmixinできるマクロacts_as_my_moduleを持つことができます。大声で文句を言うことはなく、余分なプログラマーの献身を必要としますが、ルビーエスクが最もあります – Schneems
rspecを使用している場合は、次のようなことができます:http://relishapp.com/rspec/rspec-core/v/ 2-6/dir/example-groups/shared-examples – Schneems
すべてのことが考慮されている場合は、展開の一部として実行されるツールが必要であり、このような問題がある場合は展開を停止する必要があります。すでに知っているように思えますが、代替案が期待されています: – Pat