instance_methods をインポートできることはわかっていますが、クラス メソッドをインポートすることはできますか?
質問する
301 次
2 に答える
4
一般的なイディオムは次のとおりです。
module Bar
# object model hook. It's called when module is included.
# Use it to also bring class methods in by calling `extend`.
def self.included base
base.send :include, InstanceMethods
base.extend ClassMethods
end
module InstanceMethods
def hello
"hello from instance method"
end
end
module ClassMethods
def hello
"hello from class method"
end
end
end
class Foo
include Bar
end
Foo.hello # => "hello from class method"
Foo.new.hello # => "hello from instance method"
そのInstanceMethodsモジュールとは何ですか?
クラスにインスタンスメソッドとクラスメソッドの両方を含めるモジュールが必要な場合は、2つのサブモジュールを使用します。このようにして、メソッドはきちんとグループ化され、たとえば、コードエディタで簡単に折りたたむことができます。
また、より「均一」に感じます。両方の種類のメソッドがself.included
フックから注入されます。
とにかく、それは個人的な好みの問題です。このコードはまったく同じように機能します。
module Bar
def self.included base
base.extend ClassMethods
end
def hello
"hello from instance method"
end
module ClassMethods
def hello
"hello from class method"
end
end
end
于 2013-01-11T15:16:40.187 に答える
2
簡単に言えば、いいえ、モジュール オブジェクト自体のメソッド (モジュールの「クラス」メソッド) を別のオブジェクトの継承チェーンに含めることはできません。@ Sergioの答えは、一般的な回避策です(「クラス」メソッドを別のモジュールの一部として定義することによる)。
次の図が参考になるかもしれません (クリックしてフルサイズで表示するか、PDF を入手してください)。
(ソース: phrogz.net )
注: この図は、Ruby 1.9 用にまだ更新されていませんBasicObject
。ルート フローをわずかに変更するようなコア オブジェクトが追加されています。
于 2013-01-11T15:48:05.750 に答える