在模块中定义类方法

时间:2013-02-13 20:45:49

标签: ruby

我的意思是,我想在我的模块中创建一个类方法,该方法将由包含该模块的类使用。它们位于不同的文件中。

到目前为止我有这样的事情:

module Base
  def self.all
    puts "All Users"
  end
end

class User
  include Base
end

但是我得到了:NoMethodError: undefined method全部为用户:Class`

你能否解释一下这个问题,以及我所做的是一种不好的做法还是违反任何原则?

2 个答案:

答案 0 :(得分:3)

你可以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类方法,那就更好了。

答案 1 :(得分:0)

根据里卡多的回答,考虑一下Ruby程序员常用的习惯用法 - 将模块的类方法包含在内部模块中,称为ClassMethods(我知道这是一口),并使用Module #include钩子来扩展基类和ClassMethods模块。

此处提供更多信息:http://www.railstips.org/blog/archives/2009/05/15/include-vs-extend-in-ruby/