首页 文章

在Ruby中如何使用动态调度(当方法是模块的一部分时)调用方法?

提问于
浏览
1

在Ruby语言中,我必须动态调用属于Module的方法,将方法名称作为存储的字符串(例如: "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() .

谢谢乔治

1 回答

  • 2

    我认为你不能 . 在模块上以这种方式定义的方法不应直接访问 .

    Dialogs.paperino('a')
    NoMethodError: undefined method `paperino' for Dialogs:Module
    

    您可以使用 selfDialogs 上定义它

    def self.paperino(param)
    

    然后你就可以用 method 访问它了

    Dialogs.method(:paperino)
    

    如果您需要将其定义为 def paperino(param) ,这是一种可以访问该方法的方法 .

    method = (Object.new.extend(Dialogs)).method(:paperino)
    method.call('foo')
    

    这定义了一个新对象,然后使用模块 Dialogs 扩展该对象 . 然后你就可以得到这个方法 .

相关问题