只加载 Ruby 中正在使用的类?

Posted

技术标签:

【中文标题】只加载 Ruby 中正在使用的类?【英文标题】:Load only what classes are being used in Ruby? 【发布时间】:2012-04-17 15:31:13 【问题描述】:

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

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

对检查文档的脚本感到满意,并输出一个只有 Hello 类和使用它的代码的 .rb...如果不存在,那将是一个有趣的 github 项目,但我认为它已经过时了我的技能自动取款机。

【问题讨论】:

不,这是不可能的。源文件被完整地加载和评估。为什么不使用单独的文件? 您和计算机在专门加载 Hello 类上所花费的时间和内存可能比简单地同时加载 Goodbye 还要多。 【参考方案1】:

注意:我误读了问题的一部分,而另一部分不知何故回避了我……我一定是在处理多项任务。无论如何,这个答案只回答了一半的问题,而且是错误的;只是说。

好的,这是一种可能很昂贵的方法,但试试这样的方法:

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

现在,您可以使用套接字来获得更清洁的方法。我会举个例子。

【讨论】:

我没有看到与问题的联系? 它将打印definer.rb定义的所有常量,而不是在主程序中实际这样做。 等一下...我想我发错了问题... facepalm 引用问题:“是否可以检查并查看正在使用的类并仅加载这些类?”这个答案没有解决这些问题,恕我直言 我不知道,我主要是想阻止您发明另一个可能更复杂的涉及套接字(?)的示例,因为您可能只会浪费时间。我不毕竟,认为这是一个明智的问题【参考方案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

【讨论】:

以上是关于只加载 Ruby 中正在使用的类?的主要内容,如果未能解决你的问题,请参考以下文章

Ruby中的类和该类的单例有啥区别?

Java 虚拟机原理Java 类中的类加载初始化细节 ( 只使用类中的常量时加载类不会执行到 ‘初始化‘ 阶段 )

使用 Appium 和 Ruby 测试 iOS 应用程序时等待元素加载?

java中的类加载器ClassLoader和类初始化

Ruby loaderror 无法加载此类文件

谈谈Ruby中的类变量