-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

不同之处在于您正在执行的上下文。几乎每个教程都会有includeextend在下面class

class Foo
  include Thingy
end

class Bar
  extend Thingy
end

这将在定义类时执行:selfis Foo(或Bar)(类型Class)。extend因此会将模块内容转储到self- 这会创建类方法。

当您在方法定义中执行此操作时,self是实例对象(类型为Fooor Bar)。因此,模块被转储到的地方发生了变化。现在,如果您extend(模块内容),它将它们转储到现在的状态self- 产生实例方法。

编辑:还值得注意的是,因为extend适用于任何实例对象,它被定义在Object. 然而,由于只有模块和类应该能够包含东西,include所以是Module类的实例方法(并且,通过继承,Class也是如此)。因此,如果您尝试将include实例方法的定义放入其中,它将很难失败,因为大多数事物(包括您的AutomationWorker)都不是 的后代Module,因此无法访问该include方法。

于 2013-11-14T08:19:02.747 回答