在 Ruby 语言中,我必须动态调用属于模块的方法,方法名称作为存储的字符串(例如:"ModuleName::Submodule:methodName"
)
让我们考虑一下这种情况:
module Dialogs
def paperino(param)
puts "paperino. param: #{param}"
end
end
如何在运行时执行 .call("parametro") ?
我解释得更好:
如果该方法是类的一部分,我知道该怎么做: 我实例化该类(从字符串中调用方法对象):
class Dialogo
def pluto(param)
puts "pluto. param: #{param}"
end
end
class_name = "Dialogo"
# create class symbol from a string
class_symbol = Kernel.const_get(class_name)
# return a new instance
class_instance = class_symbol.new
# Instantiating a method object
method_object = class_instance.method(:pluto)
# call the method in run time:
method_object.call "parametro_pluto"
以及没有显式类的方法的更简单情况
def pippo(param)
puts "pippo. param: #{param}"
end
method_object = Kernel.method(:pippo)
method_object.call "parametro"
但是动态调用属于模块一部分的方法的语法是什么?
在以下示例中:
module Dialogs
def paperino(param)
puts "paperino. param: #{param}"
end
end
我想调用的方法是“Dialogs::paperino”
顺便说一句,我不想使用 send() 或 eval(),而只想使用 call()。
谢谢 乔治奥
最佳答案
我认为你做不到。在模块上以这种方式定义的方法并不意味着可以直接访问。
Dialogs.paperino('a')
NoMethodError: undefined method `paperino' for Dialogs:Module
您可以使用self
在Dialogs
上定义它
def self.paperino(param)
然后你就可以使用方法
访问它
Dialogs.method(:paperino)
如果您需要将其定义为 def paperino(param)
,您可以通过以下方式访问该方法。
method = (Object.new.extend(Dialogs)).method(:paperino)
method.call('foo')
这定义了一个新对象,然后使用模块Dialogs
扩展该对象。然后就可以获取方法了。
关于ruby-on-rails - 如何在 Ruby 中使用动态分派(dispatch)调用方法(当方法是模块的一部分时)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39193177/