类方法和实例方法之间有什么区别。
我需要在帮助程序“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
答案 0 :(得分:2)
区别在于您正在执行的上下文。几乎每个教程都会include
下的extend
或class
:
class Foo
include Thingy
end
class Bar
extend Thingy
end
这将在定义类时执行:self
为Foo
(或Bar
)(类型为Class
)。因此extend
会将模块内容转储到self
- 这会创建类方法。
在方法定义中执行此操作时,self
是实例对象(类型为Foo
或Bar
)。因此,模块被转储到更改的位置。现在,如果你extend
(模块内容),它会将它们转储到现在的self
- 导致实例方法。
编辑:值得注意的是,因为extend
适用于任何实例对象,所以它在Object
上定义。但是,由于只有模块和类应该包含东西,include
是Module
类的实例方法(并且,通过继承,Class
也是如此)。因此,如果您尝试将include
置于实例方法的定义中,它将会很难,因为大多数事情(包括您的AutomationWorker
)都不是Module
的后代,因此无法访问include
方法。