4

我正在这样做

def self.a
  ...
end

def a
  class.a
end

但是对于几种方法,我将不得不复制实例方法。

我在想一个模块

module A
  def a; end
end

然后像这样在我的模型中使用它:

extend A
include A

但是我不确定根据 Rails 文件夹结构将它放在哪里,或者即使将模块放在我的模型中。

有什么建议吗?

4

2 回答 2

4

选项 1 - 扩展自我

如果您想将所有实例方法也作为类方法,您可以简单地使用extend self

class A
  def foo
    ...
  end

  def bar
    ...
  end

  extend self
end

这将允许您将 foo 称为A.fooor A.new.foo

选项 2 - 包含的模块

如果您只希望您的一些实例方法可用作类方法,那么您应该按照您的建议创建一个模块。您可以将该模块放在lib/文件夹中并需要它或添加lib到您的自动加载路径中。

您还可以像这样直接在类中包含模块:

class A
  def not_shared
    ...
  end

  module SharedMethods
    def foo
      ...
    end

    def bar
      ...
    end
  end
 
  extend  SharedMethods
  include SharedMethods
end

选项 3 - 代表

如果您使用的是 Rails(或只是 ActiveSupport),您还可以使用delegate它添加到类/模块的方法。

class A
  def not_shared
    ...
  end

  def foo
    ...
  end

  def bar
    ...
  end
 
  delegate :foo, :bar, to: 'self.class'
end

有关详细信息,请参见此处:

http://rdoc.info/docs/rails/3.0.0/Module:delegate

于 2013-05-21T01:32:47.757 回答
2

您想创建一个模块,例如shared_methods.rb,您将文件放在/lib目录中。

您将包括这样的模块:

class NewClass
  include SharedMethods

  ...

end
于 2013-05-21T01:03:17.687 回答