假设我有一个需要不同文件的应用程序。每个文件都包含一个用途的“东西”。我把它称为“事物”,因为我不确定它是一个类还是一个模块。
第一件事
# things/one.rb
class One
def self.do_it
"I'm the one"
end
end
第二个
# things/two.rb
class Two
def self.do_it
"I'm not the only one!"
end
end
现在我想要things
目录中的所有文件并执行do_it
方法。但我想动态地做这件事 - 对于东西文件夹中的每件事情,甚至不知道他们的班级名称。
# app.rb
Dir["things/*.rb"].each {|file| require file }
请记住:我只想在事物文件中执行代码 - 它们不一定是类或模块
答案 0 :(得分:1)
由于多种原因,您无法可靠地执行此操作,但最重要的是您没有义务在任何给定文件或类中声明单个类。在加载特定目录中的所有文件时,你有了正确的想法,但是如果你需要对它们进行操作,那么有两种方法可以解决这个问题。
最简单的方法是将这些类声明为某些已知父级的子类。 ActiveSupport使用descendents
方法来反映特定的类,这是Rails的一部分,但您也可以the hard way if you have to。
第二种最简单的方法是将名称与其中的类相关联,然后在算法上将文件名转换为类名。这就是Rails自动加载器的工作原理。 cat.rb
包含Cat
,bad_dog.rb
包含BadDog
,依此类推。
如果你仔细观察Test :: Unit之类的工作方式,他们会采用第一种方法,任何声明的测试子类都会在Ruby进程终止之前执行。这是一个相当简单的系统,它不会对文件的调用或声明类的位置和方式施加任何限制。
Rails倾向于路径传达意图的第二种方法。这使得查找文件更具可预测性,但开发人员需要更多的纪律来符合该标准。
他们都有价值。选择适合您用例的那个。