ruby-on-rails - 如何在 Ruby 中使用动态分派(dispatch)调用方法(当方法是模块的一部分时)?

标签 ruby-on-rails ruby methods module dynamic-binding

在 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

您可以使用selfDialogs上定义它

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/

相关文章:

ruby - 关于 Ruby/ChefSpec 编码风格的反馈

ruby - 这是 Ruby 中一组数组的预期行为吗?

c# - 检查功能参数的最佳方法 : Check for null or try/catch

ruby-on-rails - 如何处理 app.yaml 中的 secret 而不将其放入 GIT?

ruby-on-rails - Rails 3.2 从本地 SQLite 到 Heroku 上的 Postgres

ruby-on-rails - Rails 路由到唯一索引

ruby-on-rails - 正则表达式使 Ruby 完全卡住

ruby - Rails 应用程序的出生日期正则表达式 yyyy-mm-dd

java - 方法中不属于签名或正文的部分的名称是什么

ios - 从另一个 ViewController2.m 文件调用在 ViewController1.m 中声明的方法