我这样做
def self.a
...
end
def a
class.a
end
但是对于几种方法,我必须复制实例方法。
我正在考虑一个模块
module A
def a; end
end
然后在我的模型中使用它:
extend A
include A
但我不确定在Rails文件夹结构中放置它,或者甚至将模块放入我的模型中。
有什么建议吗?
答案 0 :(得分:4)
如果您希望将实例方法的 所有 作为类方法,则只需使用extend self
class A
def foo
...
end
def bar
...
end
extend self
end
这样您就可以将foo称为A.foo
或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
详情请见此处:
答案 1 :(得分:2)
您要创建一个模块,例如shared_methods.rb
,您将该文件放在/lib
目录中。
您可以包含以下模块:
class NewClass
include SharedMethods
...
end