2011-03-15 38 views
3

我想开发一个小应用程序,让用户通过将它们放入特定目录(例如extension/*。rb)来自动添加它们自己的类。ruby​​加载文件中的所有类

启动应用程序后,我想加载所有文件并加载此文件中包含的所有类。之后我想调用一个特定的方法。

伪代码它应该是这样的:

for each file in extensions/*.rb 
arr = loadclasses(file) 
for each class in arr 
    obj = class.new_instance 
    obj.run 
end 
end 

回答

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) 

记住:类只是对象。这只是他们碰巧有一个classClass

2

以及将工作与你有每个文件和类名(驼峰)一类的假设很简单的文件名匹配(用下划线表示),例如MyClass的s文件中my_class.rb

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

'迪尔[ “扩展/ *。RB”]'是调用的可以说是更合适的方法'Dir.glob(...)' – Gareth 2011-03-15 01:22:31

+0

你可以将感兴趣的'classify'方法(见[这里](http://apidock.com/rails/ActiveSupport/Inflector/classify))从'ActiveSupport'而不是'file_name.gsub(..)'。 – code1n 2013-07-12 11:35:45

1

看看这个宝石,它会自动找到并加载(只有那些你需要,只有当你需要它时)类为你的应用程序。

您也可以指定它观看并自动重新加载更改的文件。

http://github.com/alexeypetrushin/class_loader

相关问题