只加载Ruby中使用的类?

时间:2012-04-03 22:31:17

标签: ruby class require ruby-1.9.3

如果我加载x.rbthen all the classes in that file are loaded。是否可以检查并查看正在使用的类并仅加载它们?

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

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

2 个答案:

答案 0 :(得分:2)

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

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

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

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

那是因为源代码实际上只是文本。对于解释型语言尤其如此。例如,in Java, you can usually only declare one public type per "compilation unit"。在Ruby中,没有这样的东西。


¹Matz strongly discourages the practice

²Ruby Inside article on autoload

答案 1 :(得分:0)

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

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

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

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