是否可以通过使用字符串作为模块来扩展 class ? - Ruby 2.7.1

Is it possible to extend a class by using a string as a module ? - Ruby 2.7.1

我正在 FreeBSD 12.1 上使用 Ruby 2.7.1 进行一些测试。我知道如何使用模块扩展 class,例如:

class Myclass
  def mymethod
    extend Mymodule
  end
end

但是是否有可能通过如下所示获得相同的结果:

class Myclass
  def mymethod
    var = "Mymodule"
    extend var
  end
end

如果我那样做,我当然会得到一个错误,因为扩展指向一个字符串而不是一个模块。

这里有一些解释 - 它在以下应用中很有用,例如:

假设您有一个包含很多 ruby 脚本的文件夹,它们都是名称明显的模块。例如 abcd.rb 将包含模块 Abcd。所以我创建了一个文件列表并将其保存在一个数组中。然后我可以加载或需要此数组中列出的所有这些文件。由于模块的名称是可预测的,我只需要对数组的索引执行一些 .sub、.chop 和 .capitalize 方法,以获得看起来就像模块名称的可行结果。

我的想法是创建一种自动扩展我的主要 class 与所有这些模块的方法。在这个想法中,任何添加到文件夹的模块都将自动加载并准备好使用。

但是由于我的数组操作的结果不是“纯”模块名称而是字符串,所以我就卡在这里了。

那么,有没有办法实现这个(也许我使用了错误的路径)或者不可能?

提前致谢!

您不能 extend "arbitrary string",但您可以先将其转换为 module

class Myclass
  def mymethod
    var = "Mymodule"
    extend self.class.const_get(var)
  end
end

其中 const_get 可以轻松解析简单的模块名称,例如 XX::Y

ActiveSupport 中还有 constantize 方法,与 Rails 捆绑在一起,其作用与此类似:

extend var.constantize