-2

クラスメソッドとインスタンスメソッドの違い。

ヘルパー「RemoteFocusHelper」(app/helpers/ の下) でいくつかの機能を使用する必要があります。

次に、Worker モジュールにヘルパー「RemoteFocusHelper」を含めます。

しかし、「check_environment」( RemoteFocusHelperで定義) を呼び出そうとすると、

「メソッドエラーなし」が発生しました。

「インクルード」を使用する代わりに、「拡張」を使用して動作します。

クラスメソッド内でのみクラスメソッドを使用できるというのが正しいかどうかはわかりません。

クラスメソッドでインスタンスメソッドを呼び出すことはできますか?

ところで、 rake resque:work QUEUE='*'はRemoteFocusHelperを検索する場所を どのように認識しますか?ファイル パスを指定しませんでした。rake コマンドは Rails アプリの下のすべてのファイルをトレースしますか?

automation_worker.rb


    class AutomationWorker
      @queue = :automation

      def self.perform(task=false)
        include RemoteFocusHelper
        if task
          ap task
          binding.pry
          check_environment
        else
          ap "there is no task to do"      
        end
      end
    end
4

1 に答える 1

2

違いは、実行しているコンテキストです。ほぼすべてのチュートリアルで、includeまたはextendの下にclass:

class Foo
  include Thingy
end

class Bar
  extend Thingy
end

これは、クラスが定義された時点で実行されます: selfis Foo(またはBar) (タイプClass)。したがって、クラスメソッドを作成する - にextendモジュールの内容をダンプします。self

メソッド定義内で行う場合selfは、インスタンス オブジェクト (型FooまたはBar) です。したがって、モジュールが変更される場所がダンプされます。あなたextend(モジュールの内容)なら、それらを現在のものにダンプしselfます-インスタンスメソッドになります。

extend編集: は任意のインスタンス オブジェクトで機能するため、 で定義されていることにも注意してくださいObject。ただし、モジュールとクラスのみが何かを含めることができると想定されているため、includeはクラスのインスタンス メソッドですModule(継承によってClassも同様です)。この結果include、インスタンス メソッドの定義の中に入れようとすると、ほとんどのもの (あなたの を含むAutomationWorker) は から派生しModuleていないため、メソッドにアクセスできないため、失敗しますinclude

于 2013-11-14T08:19:02.747 に答える