只有负荷红宝石正在使用哪些类?(Load only what classes are being u

2019-09-16 07:34发布

如果我加载x.rb , 然后在该文件中所有的类加载 。 是否有可能检查,看看正在使用哪些类和加载这些只?

假设x.rb同时包含您好,再见类,我的程序只使用Hello类,是有可能只加载Hello类?

快乐与检查的文件,并输出只有Hello类和使用它的代码名为.rb的脚本...将是一个有趣的GitHub项目,如果不存在,但我认为这是我的技能大气压。

Answer 1:

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

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

当你写Hello ,你实际上是在访问Hello不变。 autoload采用const_missing自动要求一个文件,如果没有定义的常量。

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

这是因为源代码是真的只是文字。 这是解释型语言尤其如此。 例如, 在Java中,你通常只能按申报“编译单元”一个公共类型 。 在Ruby中,有没有这样的事情。


¹ 马茨强烈反对的做法

² 关于Ruby里面的文章autoload



Answer 2:

注:我误解了问题的一部分,而另一部分以某种方式回避我......我一定是多任务大的时间。 不管怎么说,这个答案只回答了问题的一半,不正确; 只是说。

好吧,这里有一个可能是昂贵的方式,但尝试是这样的:

$ 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(", ")}"

现在更清洁和方式,你可以使用插座。 我会得到一个这样的例子了。



文章来源: Load only what classes are being used in Ruby?