如果我加载x.rb
,then all the classes in that file are loaded。是否可以检查并查看正在使用的类并仅加载它们?
假设x.rb包含Hello和Goodbye类,并且我的程序只使用Hello类,是否可以只加载Hello类?
对一个检查文档的脚本感到高兴,并输出一个只有Hello类的.rb和使用它的代码...如果不存在,那将是一个有趣的github项目,但我认为它不属于我的技能组合。
答案 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中,没有这样的东西。
答案 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(", ")}"
现在,为了更清洁,你可以使用套接字。我会举一个这样的例子。