我的意思是,我想在我的模块中创建一个类方法,该方法将由包含该模块的类使用。它们位于单独的文件中。
到目前为止,我有这样的事情:
module Base
def self.all
puts "All Users"
end
end
class User
include Base
end
但我得到:NoMethodError: undefined method
所有用户:类`
你能否解释一下这个问题,如果我做的是一种不好的做法或违反任何原则?
我的意思是,我想在我的模块中创建一个类方法,该方法将由包含该模块的类使用。它们位于单独的文件中。
到目前为止,我有这样的事情:
module Base
def self.all
puts "All Users"
end
end
class User
include Base
end
但我得到:NoMethodError: undefined method
所有用户:类`
你能否解释一下这个问题,如果我做的是一种不好的做法或违反任何原则?
你可以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#included 钩子来使用 ClassMethods 模块扩展基类。
更多信息在这里:http ://www.railstips.org/blog/archives/2009/05/15/include-vs-extend-in-ruby/