1

instance_methods をインポートできることはわかっていますが、クラス メソッドをインポートすることはできますか?

4

2 に答える 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 を入手してください)。

Ruby メソッド ルックアップ フロー
(ソース: phrogz.net )

注: この図は、Ruby 1.9 用にまだ更新されていませんBasicObject。ルート フローをわずかに変更するようなコア オブジェクトが追加されています。

于 2013-01-11T15:48:05.750 に答える