只加载 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 中正在使用的类?的主要内容,如果未能解决你的问题,请参考以下文章
Java 虚拟机原理Java 类中的类加载初始化细节 ( 只使用类中的常量时加载类不会执行到 ‘初始化‘ 阶段 )