我想开发一个小应用程序,让用户通过将它们放在特定目录(例如扩展名/ * .rb)中自动添加自己的类。
启动应用程序后,我想加载所有文件并加载此文件中包含的所有类。之后我想打个具体的方法。
在伪代码中它看起来像这样:
for each file in extensions/*.rb
arr = loadclasses(file)
for each class in arr
obj = class.new_instance
obj.run
end
end
答案 0 :(得分:7)
如果您想使用元编程,您可以在加载文件,加载文件以及查看已创建的新类之前找出存在哪些类。
existing_classes = ObjectSpace.each_object(Class).to_a
#load the files
new_classes = ObjectSpace.each_object(Class).to_a - existing_classes
non_anonymous_new_classes = new_classes.find_all(&:name)
objects = non_anonymous_new_classes.map(&:new)
记住:类只是对象。只是他们恰好有class
Class
。
答案 1 :(得分:2)
Dir.glob("extensions/*.rb").each{ |file_path|
file_name = File.basename(file_path, ".rb")
require file_name
class_name = file_name.gsub(/^[a-z0-9]|_[a-z0-9]/){ |a| a.upcase }.gsub(/_/,"")
class_name.constantize.new.run
}
如果每个文件需要多个类,则必须解析该文件并在class关键字后搜索该单词。
答案 2 :(得分:1)
查看此gem,它会自动查找并加载(仅限您需要的,仅在您需要的时候)您的应用程序的类。
您还可以将其指定为观看并自动重新加载已更改的文件。