如果我加载x.rb
, 然后在该文件中所有的类加载 。 是否有可能检查,看看正在使用哪些类和加载这些只?
假设x.rb同时包含您好,再见类,我的程序只使用Hello类,是有可能只加载Hello类?
快乐与检查的文件,并输出只有Hello类和使用它的代码名为.rb的脚本...将是一个有趣的GitHub项目,如果不存在,但我认为这是我的技能大气压。
如果我加载x.rb
, 然后在该文件中所有的类加载 。 是否有可能检查,看看正在使用哪些类和加载这些只?
假设x.rb同时包含您好,再见类,我的程序只使用Hello类,是有可能只加载Hello类?
快乐与检查的文件,并输出只有Hello类和使用它的代码名为.rb的脚本...将是一个有趣的GitHub项目,如果不存在,但我认为这是我的技能大气压。
当类在自己单独的文件中定义,你可以使用autoload
¹²方法:
autoload :Hello, 'x/hello'
autoload :Goodbye, 'x/goodbye'
当你写Hello
,你实际上是在访问Hello
不变。 autoload
采用const_missing
自动要求一个文件,如果没有定义的常量。
请注意,我们仍在与文件打交道这里。 内容x/hello.rb
将简单地读取和评估。 该代码可以运行任何操作。 它可以require
的其他文件。 它可以定义一个亿的其他类。
这是因为源代码是真的只是文字。 这是解释型语言尤其如此。 例如, 在Java中,你通常只能按申报“编译单元”一个公共类型 。 在Ruby中,有没有这样的事情。
¹ 马茨强烈反对的做法
² 关于Ruby里面的文章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(", ")}"
现在更清洁和方式,你可以使用插座。 我会得到一个这样的例子了。