是否可以从带有 String 的模块执行方法? - Ruby 2.7.1

Is it possible to execute a method from a module with a String ? - Ruby 2.7.1

大家好。

这个问题是上一个问题的延续:

就是这样。我目前正在我的 FreeBSD 12.1 工作站上使用 Ruby 2.7.1 进行一些测试。我的 objective 是找到一种方法来加载目录中的所有脚本。这些脚本是具有可预测名称的模块。例如,如果我有一个名为 mymodule.rb 的脚本,它将包含一个名为:Mymodule 的模块和一个方法:mymodule。所以我可以使用数组列出目录中的所有脚本。我可以使用该列表轻松 load/require 我所有的脚本文件。在一些 .sub、.chop 或 .capitalize 的帮助下,我可以从数组的每个索引中提取我需要的内容。但是这个操作的结果总是一个字符串。问题是我无法使用 String 执行方法。以前我在使用字符串中的模块名称扩展我的 main class 时遇到问题,但是给出了答案并解决了这个小问题。这是我的主要 class :

load "mymodule.rb"
class Myclass
  def mymethod
    var1 = "Mymodule"
    extend self.class.const_get(var1)
    var2 = "mymodule"
    #I need something here to call the method from the module.
    #puts @varmod
  end
end

a = Myclass.new
a.mymethod

这是我的模块:

module Mymodule
  def mymodule
    @varmod = "TEST"
  end
end

所以,我想知道是否有一种方法可以在 Mymodule 中执行与“扩展 self.class.const_get(var1)”相同的方法。

提前感谢您的回复!

我认为这是您正在寻找的 send 方法。以下应该有效:

send(var2)

为了发送消息的名称在设计时不是静态已知的,您可以使用 Object#public_send 方法:

public_send(var2)

在这种情况下没有必要使用 Object#send,因为您的方法不是 private