在Ruby模块上调用方法

在Ruby模块上调用方法,ruby,Ruby,我有以下Ruby代码: module MyModule class MyClass def self.my_method end end end 要调用myu方法,我输入MyModule::MyClass.myu方法。我想在模块本身上为my_方法编写一个包装: MyModule.my_method 这可能吗?您可以直接在模块内部定义方法 module MyModule def self.my_method puts "Hi I am #{self}"

我有以下Ruby代码:

module MyModule
  class MyClass
    def self.my_method
    end
  end
end
要调用
myu方法
,我输入
MyModule::MyClass.myu方法
。我想在模块本身上为
my_方法
编写一个包装:

MyModule.my_method

这可能吗?

您可以直接在模块内部定义方法

module MyModule
  def self.my_method
    puts "Hi I am #{self}"
  end
end

MyModule.my_method  #=> Hi I am MyModule
简单方法:

module MyModule
  def self.my_method(*args)
    MyModule::MyClass.my_method(*args)
  end
end
更难的方法:


使用元编程为所有情况编写一个函数(如attr\u accessor)。

我不确定您想要实现什么,但是:如果您将其作为常规方法并使用module\u函数对其进行修改,您将能够以您选择的任何方式调用它

#!/usr/bin/ruby1.8

module MyModule

  def my_method
    p "my method"
  end
  module_function :my_method

end
完成此操作后,您可以包括该模块并将该方法作为实例方法调用:

class MyClass

  include MyModule

  def foo
    my_method
  end

end

MyClass.new.foo      # => "my method"
或者,您可以将该方法作为模块上的类方法调用:

MyModule.my_method   # => "my method"

我想我现在知道为什么它以前不起作用了:我在一个文件(my_module.rb)中声明了MyModule.my_方法,在另一个文件(my_class.rb)中声明了MyModule::MyClass.my_方法。当我将上述方法放入我的_class.rb中时,MyModule.my_方法起作用了!更简单的方法:要求“可转发”。在您的情况下,您可以在模块上调用您的方法吗?在我的方法之前你不需要赛尔夫吗?@Jwan622我已经试着改进我的答案了。它现在回答你的问题了吗?更好的方法是什么?my_方法还是模块功能:my_方法?对我来说,这两件事都很重要job@KargWare
def self.my_方法
创建一个只能使用
MyModule.my_方法
调用的方法。使用
module\u函数:my\u方法
创建一个方法,该方法可以使用
MyModule.my\u方法
,或“包含我的模块的\u类的实例\u.my\u方法”调用`