ruby autoload与常量

浏览:2170 发布日期:2018-05-26 01:57:18

Kernel#autoload, Module#autoload

它们自动加载一个文件,绑定到一个常量,例如:

module A
  autoload :B, "./b.rb"
  autoload :C, "./b.rb"
  autoload :Dd, "./b.rb"
end

autoload(mod, filename) mod是模块的字符串或符号名称,必须与类或模块名称匹配。不能自定义。filename中可以定义多个类

b.rb中并不存在Dd这个常量,但这并不妨碍你访问constants(false)返回它,当你调用const_defined?(:Dd, false)时,它同样返回true。

autoload 会调用Kernel#require方法,但却不能通过A::B来访问。本质上它解决的是,不需要手动require方式来加载一个文件。因为它并不是include。它只是让我们可以访问这个常量。我们在模块A中autoload :B, :C,我们可以通过constget(:B, true)来获取常量,它会require "./b.rb",它最终被定义在Object上。但如果我们没有提前访问B变量,我们通过Object.constget(:B, false)是无法访问的,因为我们并未在Object内部来定义autoload规则。

remove_const可以移除autoload设置的常量,前提是没有触发自动加载,因为触发自动加载后,将会将常量定义到Object中。