在Ruby模块上调用方法

gsm*_*oza 18 ruby

我有以下Ruby代码:

module MyModule
  class MyClass
    def self.my_method
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

要打电话my_method,我进入MyModule::MyClass.my_method.我想my_method在模块本身上写一个包装器:

MyModule.my_method
Run Code Online (Sandbox Code Playgroud)

这可能吗?

Way*_*rad 31

我不确定你想要实现什么,但是:如果你把它作为常规方法并用module_function修改它,你将能够以你选择的任何方式调用它.

#!/usr/bin/ruby1.8

module MyModule

  def my_method
    p "my method"
  end
  module_function :my_method

end
Run Code Online (Sandbox Code Playgroud)

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

class MyClass

  include MyModule

  def foo
    my_method
  end

end

MyClass.new.foo      # => "my method"
Run Code Online (Sandbox Code Playgroud)

或者您可以将该方法作为模块上的类方法调用:

MyModule.my_method   # => "my method"
Run Code Online (Sandbox Code Playgroud)


use*_*365 15

简单方法:

module MyModule
  def self.my_method(*args)
    MyModule::MyClass.my_method(*args)
  end
end
Run Code Online (Sandbox Code Playgroud)

更难的方法:

使用元编程为所有情况编写函数(如attr_accessor).


ans*_*hul 11

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

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

MyModule.my_method  #=> Hi I am MyModule
Run Code Online (Sandbox Code Playgroud)