0

仅通过阅读以下内容无法理解如何工作Module#autolad和工作:Module#autoload?

Module#autoload:在 mod 的命名空间中第一次访问模块(可能是字符串或符号)时注册要加载的文件名(使用 Kernel::require)。

模块#自动加载?- 如果名称在 mod 的命名空间中注册为自动加载,则返回要加载的文件名。c**有人通过一些小代码示例帮助我理解这个概念吗?

4

2 回答 2

1

例子:

$ echo 'class AutoloadDemo; end' > autoload_demo.rb
$ ruby -e "
> p autoload? :AutoloadDemo
> p defined?(AutoloadDemo)
> autoload :AutoloadDemo, './autoload_demo'
> p autoload? :AutoloadDemo
> p defined?(AutoloadDemo)
> p AutoloadDemo
> "
nil
nil
"./autoload_demo"
"constant"
AutoloadDemo

解释:autoload为一个常量注册一个“延迟加载”(即方法的参数符号autoload);当在脚本中遇到该符号(在示例中AutoloadDemo)表示的常数时,Ruby 需要与该常量(的第二个参数autoload)关联的文件。autoload?只不过是对“这个常量是否为自动加载而注册?”这个问题的答案。


不断注册

在 Ruby 中,常量是在程序执行期间应该相同的值;它必须以大写字符开头。

持续注册是 Ruby 解释器在您调用时所做的:autoload它说

好的,当我在下一次执行中遇到这个常量时,如果它没有定义,而不是引发 NameError 我需要这个文件并查看它是否定义了常量;如果是这样,我继续执行。

于 2013-03-12T21:43:10.760 回答
0

基本上,自动加载是第一次使用常量时加载 ruby​​ 文件的一种方式。这对于第一次使用常量时的“延迟加载”或“及时加载”很有用。有关详细信息,请参阅http://www.rubyinside.com/ruby-techniques-revealed-autoload-1652.html

于 2013-03-12T21:37:23.537 回答