2011-03-15 35 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

相關問題