我正在FreeBSD 12.1上用Ruby 2.7.1进行一些测试。我知道如何使用模块扩展类,例如这样:
如果我像这样做,那么我肯定会得到一个错误,因为extend指向字符串而不是模块。
以下是一些解释 - 这在以下应用程序中非常有用:
假设您有一个带有许多Ruby脚本的文件夹,它们都是具有明显名称的模块。例如,abcd.rb将包含模块Abcd。因此,我创建了一个文件列表并将其保存在数组中。然后,我可以加载或需要在此数组中列出的所有这些文件。由于模块的名称是可预测的,因此我只需执行一些.sub,.chop和.capitalize方法来获取数组索引的可行结果,该结果看起来就像模块的名称。
想法是创建一种平均方式,以便自动扩展我的主类到所有这些模块。在这个想法中,添加到文件夹中的任何模块都将自动加载并准备好使用。
但是,由于我的数组操作的结果不是“纯”模块名称,而是字符串,所以我就卡在这里了。
那么,有没有办法实现这一点(也许我使用了错误的路径),还是不可能的?
提前感谢!
class Myclass
def mymethod
extend Mymodule
end
end
但是有没有可能用类似这样的东西获得相同的结果:
class Myclass
def mymethod
var = "Mymodule"
extend var
end
end
如果我像这样做,那么我肯定会得到一个错误,因为extend指向字符串而不是模块。
以下是一些解释 - 这在以下应用程序中非常有用:
假设您有一个带有许多Ruby脚本的文件夹,它们都是具有明显名称的模块。例如,abcd.rb将包含模块Abcd。因此,我创建了一个文件列表并将其保存在数组中。然后,我可以加载或需要在此数组中列出的所有这些文件。由于模块的名称是可预测的,因此我只需执行一些.sub,.chop和.capitalize方法来获取数组索引的可行结果,该结果看起来就像模块的名称。
想法是创建一种平均方式,以便自动扩展我的主类到所有这些模块。在这个想法中,添加到文件夹中的任何模块都将自动加载并准备好使用。
但是,由于我的数组操作的结果不是“纯”模块名称,而是字符串,所以我就卡在这里了。
那么,有没有办法实现这一点(也许我使用了错误的路径),还是不可能的?
提前感谢!
Module#autoload
,以便更轻松地实现加载。你可以使用Dir.glob.map
,然后设置自动加载并返回符号和标签,最后加上each(&method(:extend))
。我现在没有足够的时间来撰写完整的答案,否则我会的。 - engineersmnky