1

私はruby(Java バックグラウンド) のまったくの初心者なので、これが本当にばかげた質問である場合は申し訳ありません。

モジュールに関するいくつかのチュートリアルに取り組んでいますが、それらは静的クラスに多少似ているようです。私が頭を抱えているのは、次のようなことをする理由です。

module ExampleModule

  def self.included(base)
      base.extend(ClassMethods)
  end

  module ClassMethods
      def myMethod
      end
  end
end

ClassMethodsメソッドを に入れ、ExampleModuleメソッドフックを追加して保存しないのはなぜですか。私は本当に基本的な何かが欠けていると確信していますが、私はこれにしばらく取り組んでいるので、質問する必要があると感じています.

4

2 に答える 2

3

ルビイディオムです。次のようなモジュールが必要な場合に便利です。

  • いくつかのインスタンス メソッドをクラスに追加します
  • 同時にクラス メソッドを追加する /Java の静的メソッドのように/

同じ時に

例:

module ExampleModule
  def self.included(base)
    puts 'included'
    base.extend(ClassMethods)
  end

  def foo
    puts 'foo!'
  end

  module ClassMethods
    def bar
      puts 'bar!'
    end
  end
end

class ExampleClass
  include ExampleModule
end

ExampleClass.bar

ExampleClass.new.foo

クラス メソッドを追加するだけの場合は、このイディオムは必要ありません。メソッドをモジュールに追加し、それを含める代わりに「拡張」するだけです。

Rails では、このイディオムは廃止され、代わりに ActiveSupport::Concern を使用する必要があります。

于 2013-01-30T14:20:32.213 に答える
1

ここで使用するパターンは、クラス メソッドとインスタンス メソッドの両方が ruby​​ でモジュール経由で含まれている場合に一般的です。書くだけで済むという利点があります。

include ExampleModule

代わりにインスタンスメソッドを含めてクラスメソッドを拡張するため

# include instance methods
include ExampleModule
# extend class methods
extend ExampleModule::ClassMethods

したがって、いくつかのメソッドでクラスを拡張するためだけに使用する場合、私の個人的な好みはextend直接使用することです。

module ExtensionAtClassLevel
  def bla
    puts 'foo'
  end
end

class A
  extend ExtensionAtClassLevel
end

A.bla #=> 'foo'

インスタンス メソッドとクラス メソッドの両方を追加する場合は、説明した include フックを使用します。

一部のルビストは、 include フックを介して pure に extends を使用することを好む傾向がありextendます。これは、例のようにクラスメソッドを追加するだけの場合は理由がありません。

于 2013-01-30T14:21:10.623 に答える