我正在这样做
def self.a
...
end
def a
class.a
end
但是对于几种方法,我将不得不复制实例方法。
我在想一个模块
module A
def a; end
end
然后像这样在我的模型中使用它:
extend A
include A
但是我不确定根据 Rails 文件夹结构将它放在哪里,或者即使将模块放在我的模型中。
有什么建议吗?
我正在这样做
def self.a
...
end
def a
class.a
end
但是对于几种方法,我将不得不复制实例方法。
我在想一个模块
module A
def a; end
end
然后像这样在我的模型中使用它:
extend A
include A
但是我不确定根据 Rails 文件夹结构将它放在哪里,或者即使将模块放在我的模型中。
有什么建议吗?
如果您想将所有实例方法也作为类方法,您可以简单地使用extend self
class A
def foo
...
end
def bar
...
end
extend self
end
这将允许您将 foo 称为A.foo
or A.new.foo
。
如果您只希望您的一些实例方法可用作类方法,那么您应该按照您的建议创建一个模块。您可以将该模块放在lib/
文件夹中并需要它或添加lib
到您的自动加载路径中。
您还可以像这样直接在类中包含模块:
class A
def not_shared
...
end
module SharedMethods
def foo
...
end
def bar
...
end
end
extend SharedMethods
include SharedMethods
end
如果您使用的是 Rails(或只是 ActiveSupport),您还可以使用delegate
它添加到类/模块的方法。
class A
def not_shared
...
end
def foo
...
end
def bar
...
end
delegate :foo, :bar, to: 'self.class'
end
有关详细信息,请参见此处:
您想创建一个模块,例如shared_methods.rb
,您将文件放在/lib
目录中。
您将包括这样的模块:
class NewClass
include SharedMethods
...
end