如何从特定目录自动调用Ruby脚本中的类

如何从特定目录自动调用Ruby脚本中的类,ruby,Ruby,我有一个存储*.rb文件的目录/lib。它们中的每一个都包含一个具有单个类方法的类remove\u user() 如何使主脚本自动检查这些文件并对所有文件调用相同的方法?我希望以后只在该目录中插入文件,而不以任何方式修改主脚本 我确实知道如何需要基于“”的目录中的所有文件,但我不太确定如何从这里“在循环中”调用类 更新 我已尝试使用“”中建议的代码 它会产生一个错误: /Users/apinchuk/RubymineProjects/autoaudit/init.rb:16:in `new':

我有一个存储*.rb文件的目录/lib。它们中的每一个都包含一个具有单个类方法的类
remove\u user()

如何使主脚本自动检查这些文件并对所有文件调用相同的方法?我希望以后只在该目录中插入文件,而不以任何方式修改主脚本

我确实知道如何
需要
基于“”的目录中的所有文件,但我不太确定如何从这里“在循环中”调用类

更新

我已尝试使用“”中建议的代码

它会产生一个错误:

/Users/apinchuk/RubymineProjects/autoaudit/init.rb:16:in `new': can't create instance of singleton class (TypeError)
from /Users/RubymineProjects/autoaudit/init.rb:16:in `block in load_modules'
from /Users/RubymineProjects/autoaudit/init.rb:16:in `each'
from /Users/RubymineProjects/autoaudit/init.rb:16:in `load_modules'
from /Users/RubymineProjects/autoaudit/init.rb:20:in `<top (required)>'
from -e:1:in `load'
from -e:1:in `<main>'
文件名为
create_uat_robot.rb

尝试@moveson建议如下:

files = Dir.glob("lib/*.rb")
files.each {|file| require_relative file }

klasses = Dir["lib/*.rb"].map {|file| File.basename(file, '.rb').camelize.constantize}
klasses.each { |klass| klass.delete_user(arguments) }

为我工作

首先需要创建一个类名数组:

>> klasses = Dir["lib/*.rb"].map {|file| File.basename(file, '.rb').camelize.constantize }
然后,您可以依次对每个方法调用您的方法:

>> klasses.each { |klass| klass.remove_user }

如果您不使用Rails,您可能需要ActiveSupport的字符串扩展方法(
require'active\u support/core\u ext/String'
),这将为您提供
camelize
constantize
方法。

file.split('/')。last.split('.)。first
似乎是一种非常复杂的方法来执行
file.basename(file,“.rb”)
file.basename
在这里不起作用,因为
Dir[“lib/*.rb”]
返回字符串数组,而不是文件对象。如果您知道如何返回文件对象数组,我将编辑答案以反映这一点。它是一个类方法,不是实例方法,并且它将字符串作为第一个参数:
file.basename(“/foo/bar/baz/my_module.rb”,“.rb”)#=>“my_module”
。看一看:啊。是的,现在我明白了。我已经更新了答案。谢谢。请阅读“包括链接页面”和”“。我们希望看到你努力的证据。你尝试了什么?你搜索了什么都没有找到吗?你找到了东西但没有帮助吗?你尝试过编写代码吗?如果没有,为什么?如果是,最小的代码示例是什么,显示了你尝试了什么,为什么没有成功?如果没有,看起来你没有尝试,希望我们为你编写代码。
>> klasses = Dir["lib/*.rb"].map {|file| File.basename(file, '.rb').camelize.constantize }
>> klasses.each { |klass| klass.remove_user }