1

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

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

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

class User
  include Base
end

但我得到:NoMethodError: undefined method所有用户:类`

你能否解释一下这个问题,如果我做的是一种不好的做法或违反任何原则?

4

2 回答 2

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

于 2013-02-13T20:50:17.890 回答
0

按照 Ricardo 的回答,考虑 Ruby 程序员中常见的一个习惯用法 - 将模块的类方法封装到内部模块中,称为 ClassMethods(我知道这很拗口),并使用 Module#included 钩子来使用 ClassMethods 模块扩展基类。

更多信息在这里:http ://www.railstips.org/blog/archives/2009/05/15/include-vs-extend-in-ruby/

于 2013-02-13T20:55:24.400 回答