ruby - 如何在模块中动态调用实例方法

时间:2017-04-20 09:03:05

标签: ruby

我正在尝试动态调用实例方法。我找到了sendcalleval来做到这一点。有一些动态调用类方法的例子,但我还没弄清楚如何让它适用于实例方法。

e.g。

module MyModule
  def Foo
    puts "hello"
  end
end

实例方法名称可以通过以下方式列出:

MyModule.instance_methods
#=> [:Foo]

但我无法弄清楚如何调用该方法:

MyModule.send("Foo")
#=> NoMethodError: undefined method `Foo' for MyModule:Module

MyModule.method("Foo").call
#=> NameError: undefined method `Foo' for class `Module'

eval 'MyModule.Foo'
#=> NoMethodError: undefined method `Foo' for MyModule:Module

如何通过方法名称调用实例方法,如Foo

1 个答案:

答案 0 :(得分:9)

免责声明:糟糕的做法并没有任何意义:

MyModule.instance_method(:Foo) # #<UnboundMethod: MyModule#Foo>
        .bind(Object)          # #<Method: MyModule#Foo>
        .call                  #=> hello

您无法调用未绑定的方法,因此您必须先将其绑定到某个对象。

参考文献:

如果你使用方法单例方法会更容易:

module MyModule
  def self.Foo
    puts "hello"
  end
end

MyModule.Foo
#=> "hello"

另一种选择是使用module_function(在使用此选项时阅读方法对包含对象的可见性):

module MyModule
  def Foo
    puts "hello"
  end
  module_function :Foo
end

MyModule.Foo
#=> "hello"

而另一个人正在使用extend self

module MyModule
  def Foo
    puts "hello"
  end

  extend self
end

MyModule.Foo
#=> "hello"

P.S。在方法名称中使用大写字母并不常见。在Ruby中它是非常罕见的情况,可以使用它,你的情况是 100%那个:)