如何在 Ruby 中使用动态调度调用方法(当方法是模块的一部分时)?
How to call a method with dynamic dispatch (when method is part of a Module), in Ruby?
在 Ruby 语言中,我必须动态调用属于模块的方法,将方法名称作为存储的字符串(例如:"ModuleName::Submodule:methodName"
)
让我们考虑这种情况:
module Dialogs
def paperino(param)
puts "paperino. param: #{param}"
end
end
如何在 运行 时间内执行 .call( "parametro") ?
我解释得更好:
如果该方法是 class 的一部分,我知道该怎么做:
我实例化 class(从字符串中调用方法对象):
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"
以及没有显式方法的更简单的情况class
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)
然后您就可以通过method
访问它了
Dialogs.method(:paperino)
如果您需要将其定义为 def paperino(param)
,您可以通过以下方式访问该方法。
method = (Object.new.extend(Dialogs)).method(:paperino)
method.call('foo')
这定义了一个新对象,然后使用模块 Dialogs
扩展了该对象。然后就可以得到方法了
在 Ruby 语言中,我必须动态调用属于模块的方法,将方法名称作为存储的字符串(例如:"ModuleName::Submodule:methodName"
)
让我们考虑这种情况:
module Dialogs
def paperino(param)
puts "paperino. param: #{param}"
end
end
如何在 运行 时间内执行 .call( "parametro") ?
我解释得更好:
如果该方法是 class 的一部分,我知道该怎么做: 我实例化 class(从字符串中调用方法对象):
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"
以及没有显式方法的更简单的情况class
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)
然后您就可以通过method
Dialogs.method(:paperino)
如果您需要将其定义为 def paperino(param)
,您可以通过以下方式访问该方法。
method = (Object.new.extend(Dialogs)).method(:paperino)
method.call('foo')
这定义了一个新对象,然后使用模块 Dialogs
扩展了该对象。然后就可以得到方法了