如果我加载x.rb
,则加载该文件中的所有类。是否可以检查并查看正在使用哪些类并仅加载这些类?
假设 x.rb 包含 Hello 和 Goodbye 类,而我的程序只使用 Hello 类,是否可以只加载 Hello 类?
对检查文档的脚本感到满意,并输出一个只有 Hello 类和使用它的代码的 .rb ......如果不存在,这将是一个有趣的 github 项目,但我认为它超出了我的技能集 atm .
如果我加载x.rb
,则加载该文件中的所有类。是否可以检查并查看正在使用哪些类并仅加载这些类?
假设 x.rb 包含 Hello 和 Goodbye 类,而我的程序只使用 Hello 类,是否可以只加载 Hello 类?
对检查文档的脚本感到满意,并输出一个只有 Hello 类和使用它的代码的 .rb ......如果不存在,这将是一个有趣的 github 项目,但我认为它超出了我的技能集 atm .
当类在自己的单独文件中定义时,您可以使用autoload
¹² 方法:
autoload :Hello, 'x/hello'
autoload :Goodbye, 'x/goodbye'
当您编写 时Hello
,您实际上是在访问Hello
常量。如果未定义常量,则用于自动要求文件autoload
。const_missing
请注意,我们仍然在这里处理文件。的内容x/hello.rb
将被简单地读取和评估。该代码可以运行任何操作。它可以是require
其他文件。它可以定义一百万个其他类。
那是因为源代码实际上只是文本。对于解释型语言尤其如此。例如,在 Java 中,每个“编译单元”通常只能声明一个公共类型。在 Ruby 中,没有这样的东西。
注意:我误读了问题的一部分,而另一部分以某种方式回避了我……我一定是在处理多项任务。无论如何,这个答案只回答了一半的问题,而且是错误的;只是说。
好的,这可能是一种昂贵的方法,但试试这样的方法:
$ 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(", ")}"
现在为了更清洁和方式,您可以使用套接字。我会举一个例子。