只加载Ruby中使用的类?

如果我加载x.rb , 则加载该文件中的所有类 。 是否可以检查并查看正在使用的类并仅加载这些类?

假设x.rb包含Hello和Goodbye类,并且我的程序只使用Hello类,是否可以只加载Hello类?

很高兴用一个检查文档的脚本,并输出一个只有Hello Class的代码和使用它的代码…如果不存在,那将是一个有趣的github项目,但我认为这不属于我的技能组合atm 。

当类在它们自己的单独文件中定义时,您可以使用autoload ¹²方法:

 autoload :Hello, 'x/hello' autoload :Goodbye, 'x/goodbye' 

编写Hello ,实际上是在访问Hello常量。 如果未定义常量, autoload使用const_missing自动要求文件。

请注意,我们仍在处理文件。 将简单地读取和评估x/hello.rb的内容。 该代码可以运行任何操作。 它可能require其他文件。 它可以定义一百万个其他类。

那是因为源代码实际上只是文本。 对于解释型语言尤其如此。 例如, 在Java中,通常只能为每个“编译单元”声明一个公共类型 。 在Ruby中,没有这样的东西。


¹Matz强烈反对这种做法

²RubinInside autoload文章

注意:我误读了部分问题而另一部分以某种方式回避了我……我一定是多任务处理的。 无论如何,这个答案只能回答问题的一半,而且不正确; 只是说。

好的,这是一种可能很昂贵的方式,但尝试这样的事情:

 $ cat definer.rb class Foo def greet(person) puts "Hello, #{person}!" end end Bar = Class.new $ cat finder.rb $LOAD_PATH << File.dirname "." before = Object.constants require 'definer' after = Object.constants print (before - after).join(" ") $ cat looker.rb differences = `ruby finder.rb`.split(" ") puts "The following constants will be defined when finder.rb is loaded: #{differences.join(", ")}" 

现在,为了更清洁和方式,你可以使用套接字。 我会举一个这样的例子。