只加载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(", ")}"
现在,为了更清洁和方式,你可以使用套接字。 我会举一个这样的例子。