ruby加载文件中的所有类

时间:2011-03-15 00:03:51

标签: ruby classloader

我想开发一个小应用程序,让用户通过将它们放在特定目录(例如扩展名/ * .rb)中自动添加自己的类。

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

在伪代码中它看起来像这样:

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

3 个答案:

答案 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)

假设每个文件有一个类,并且类名(在camel-case中)与文件名(在下划线中)匹配,例如,那么这将非常简单。 MyClass在文件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 :(得分:1)

查看此gem,它会自动查找并加载(仅限您需要的,仅在您需要的时候)您的应用程序的类。

您还可以将其指定为观看并自动重新加载已更改的文件。

http://github.com/alexeypetrushin/class_loader