在模块中定义类方法
问题描述:
我的意思是,我想在我的模块中创建一个类方法,该方法将由包含该模块的类使用。他们在分开的文件。在模块中定义类方法
到目前为止,我有这样的事情:
module Base
def self.all
puts "All Users"
end
end
class User
include Base
end
但我发现了:NoMethodError: undefined method
所有”用户:Class`
能否请您解释一下这个问题,如果我在做什么是不好的做法还是违背任何原则?
答
可以extend
模块中的类,你的代码应该是这样的:
module Base
def all
puts "All Users"
end
end
class User
extend Base
end
当你做这样的事情:
module MyModule
def self.module_method
puts "module!"
end
end
你实际上添加的方法在模块本身,你可以调用像这样的以前的方法:
MyModule.module_method
有我这是一种只包含module
并获得所需行为的方法,但我不认为这可能被认为是“要走的路”。看一下例子:
module Base
def self.included(klass)
def klass.all
puts "all users"
end
end
end
class User
include Base
end
但是就像我说的,如果你可以用extend
类的方法去,这是一个更适合。
答
以下是Ricardo的回答,请考虑一下Ruby程序员常用的习惯用法 - 将模块的类方法封装到内部模块中,称为ClassMethods(这真是一口,我知道),并且使用和Module#包含钩子来使用ClassMethods模块扩展基类。
更多的信息在这里:http://www.railstips.org/blog/archives/2009/05/15/include-vs-extend-in-ruby/
谢谢大家!这和@安东的答案解决了这个问题。 – 2013-02-13 21:01:17