有没有办法在模块中使用类方法而不在rails中扩展它?

时间:2017-09-19 06:25:02

标签: ruby-on-rails ruby class oop

目前我有一个这样的模块:

module MyModule
  def A

  end

  .....

end

我有一个模型,我想将方法​​A用作类方法。然而,事情是我只需要一个方法。如果我扩展它,我会将其他不必要的类方法扩展到我的模型中。因此,有没有办法让我像MyModule.A那样做,而不是像这样重写模块:

module MyModule
  def A
    ...
  end

  def self.A
    ...
  end

  .....

end

如果我这样做的话,有点重复自己。我仍然觉得在Rails中有更好的方法。

2 个答案:

答案 0 :(得分:8)

使用Module#module_function使单个函数成为模块函数:

module M
  def m1; puts "m1"; end
  def m2; puts "m2"; end
  module_function :m2
end

或:

module M
  def m1; puts "m1"; end
module_function # from now on all functions are defined as module_functions
  def m2; puts "m2"; end
end

M.m1 #⇒ NoMethodError: undefined method `m1' for M:Module
M.m2 #⇒ "m2"

答案 1 :(得分:1)

是的,您可以将其定义为 module_function ,然后您应该可以使用模块名称访问它。

例如:

module Mod
  def my_method
    100
  end

  def self.my_method_1
    200
  end
  module_function :my_method
end

Mod.my_method
# => 100
Mod.my_method_1
# => 200

注意:无需在module_function 中添加自定义方法,可以直接访问它们。但是,没有自我定义的方法需要它