实例和类方法包括& extend(Ruby,Rails)之间有什么区别

时间:2013-11-14 08:10:46

标签: ruby-on-rails ruby

类方法和实例方法之间有什么区别。

我需要在帮助程序“RemoteFocusHelper”中使用一些函数(在app / helpers /下)

然后在Worker模块中包含帮助程序“RemoteFocusHelper”

但当我尝试调用'check_environment'(在 RemoteFocusHelper 中定义)时,

提出“”没有方法错误“”。

我没有使用“include”,而是使用了“extend”并且工作。

我想知道在类方法中我们只能使用类方法是否正确。

是否可以在类方法中调用实例方法?

顺便说一句, rake resque:work QUEUE ='*'如何知道在哪里搜索 RemoteFocusHelper 我没有给它文件路径.Is 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

1 个答案:

答案 0 :(得分:2)

区别在于您正在执行的上下文。几乎每个教程都会include下的extendclass

class Foo
  include Thingy
end

class Bar
  extend Thingy
end

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

在方法定义中执行此操作时,self是实例对象(类型为FooBar)。因此,模块被转储到更改的位置。现在,如果你extend(模块内容),它会将它们转储到现在的self - 导致实例方法。

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