我正在尝试动态调用实例方法。我找到了send
,call
,eval
来做到这一点。有一些动态调用类方法的例子,但我还没弄清楚如何让它适用于实例方法。
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
?
答案 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%那个:)