我喜欢从文件系统中读取 ruby 文件并获取实际的 ruby 类
Dir["app/controllers/admin/*.rb"].select{ |f|
require File.expand_path(f)
#how to turn 'f' into an actual class
}
我遇到的问题是 Kernel.load 或 require 都只用 bool 值响应。有没有办法获得实际的类(class)。我知道我可以使用文件路径来确定名称,但我不喜欢处理 namespace 。我怎样才能做到这一点?
最佳答案
首先,我要预先告诉您这可能是个坏主意。 Ruby 中的文件与类没有任何关系。一个文件可以定义一个类,也可以不定义类,也可以定义多个类,甚至可以根据任意条件动态定义类。此外,类定义可能分布在多个文件中,并且类可以在运行时动态更改。因此,至少可以说,可靠地确定文件中是否定义了一个类是一项艰巨的任务。
也就是说,这是您可能解决问题的一种方法。请注意,此解决方案非常棘手,并非在所有情况下都有效,如果您不小心,它可以多次加载同一文件:
module ClassLoader
def self.load_classes(file)
context = Module.new
context.class_eval(File.read(file), file)
context.constants.map{|constant| [constant, context.const_get(constant)]}.to_h
end
end
用法:
./test_file.rb
:
if rand < 0.5
class A
end
else
class B
end
end
class C
end
您的代码:
ClassLoader.load_classes('./test_file.rb') #=> {:A=>#<Module:0x9a3c128>::A, :C=>#<Module:0x9a3c128>::C}
或者,如果您使用的是 Rails,通常可以从文件名中推断出类名。这在某种程度上更可靠,因为它依赖于 Rails 为自动加载常量所做的相同约定:
Dir["app/controllers/admin/*.rb"].select{ |f|
File.basename(f).camelize.constantize
}
关于ruby-on-rails - .rb 文件中的 Ruby 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28370193/