2

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

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

对检查文档的脚本感到满意,并输出一个只有 Hello 类和使用它的代码的 .rb ......如果不存在,这将是一个有趣的 github 项目,但我认为它超出了我的技能集 atm .

4

2 回答 2

2

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

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

当您编写 时Hello,您实际上是在访问Hello常量。如果未定义常量,则用于自动要求文件autoloadconst_missing

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

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


¹ Matz 强烈反对这种做法

²关于 Ruby Inside 的文章autoload

于 2012-04-03T22:54:51.307 回答
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(", ")}"

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

于 2012-04-03T22:52:09.263 回答