Ruby需要多个文件而不知道他们的类名

时间:2017-01-25 20:52:24

标签: ruby class methods

假设我有一个需要不同文件的应用程序。每个文件都包含一个用途的“东西”。我把它称为“事物”,因为我不确定它是一个类还是一个模块。

第一件事

# 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 }

请记住:我只想在事物文件中执行代码 - 它们不一定是类或模块

1 个答案:

答案 0 :(得分:1)

由于多种原因,您无法可靠地执行此操作,但最重要的是您没有义务在任何给定文件或类中声明单个类。在加载特定目录中的所有文件时,你有了正确的想法,但是如果你需要对它们进行操作,那么有两种方法可以解决这个问题。

最简单的方法是将这些类声明为某些已知父级的子类。 ActiveSupport使用descendents方法来反映特定的类,这是Rails的一部分,但您也可以the hard way if you have to

第二种最简单的方法是将名称与其中的类相关联,然后在算法上将文件名转换为类名。这就是Rails自动加载器的工作原理。 cat.rb包含Catbad_dog.rb包含BadDog,依此类推。

如果你仔细观察Test :: Unit之类的工作方式,他们会采用第一种方法,任何声明的测试子类都会在Ruby进程终止之前执行。这是一个相当简单的系统,它不会对文件的调用或声明类的位置和方式施加任何限制。

Rails倾向于路径传达意图的第二种方法。这使得查找文件更具可预测性,但开发人员需要更多的纪律来符合该标准。

他们都有价值。选择适合您用例的那个。