是否可以通过使用字符串作为模块来扩展 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
可以轻松解析简单的模块名称,例如 X
和 X::Y
。
ActiveSupport 中还有 constantize
方法,与 Rails 捆绑在一起,其作用与此类似:
extend var.constantize
我正在 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
可以轻松解析简单的模块名称,例如 X
和 X::Y
。
ActiveSupport 中还有 constantize
方法,与 Rails 捆绑在一起,其作用与此类似:
extend var.constantize