def Object.const_missing(name)
@looked_for ||= {}
str_name = name.to_s
raise "Class not found: #{name}" if @looked_for[str_name]
@looked_for[str_name] = 1
file = str_name.downcase
require file
klass = const_get(name)
return klass if klass
raise "Class not found: #{name}"
end
现在我明白这一点是在触发自动加载并且Constant不能位于其当前嵌套范围内时从const_missing中解救。我也理解,任务是要求在自动加载过程中可能被忽略的文件,其文件名与缺失常量的名称相同。
然而,有些事情让我感到困惑。首先,@looked_for ||= {}
如果我没有弄错的话就是@looked_for || @looked_for = {}
。为什么他们决定把它放在那里,考虑到我们知道@looked_for是零?我们只是创建了这个实例变量,我们知道它会变空,为什么不只说@looked_for = {}
?
另外,它说if @looked_for[str_name]
但是如果我们刚刚创建它,我们的@looked_for哈希怎么可能已经有了现有密钥?不是没有?更重要的是,函数的其余部分都在if
语句之下,所以如果@looked_for确实为空,事后就不会发生任何事情。
如果这个@looked_for变量已经存在并且确实有我们常量名称的那个键,@ looked_for [str_name]为什么我们将它设置为1
?那是什么目的?
答案 0 :(得分:0)
为什么他们决定把它放在那里,考虑到我们知道
@looked_for
是零?
我们不知道。它可能已经有价值了。请记住,这是类对象上的实例变量。课程很长一段时间。
我的问题的主要缺点是,设置
的目的是什么?@looked_for[str_name] = 1
使用相同的参数短接const_missing
的后续调用(因为我们已经尝试过并且没有找到匹配的常量)。同样,这是可能的,因为在@looked_for
的调用之间const_missing
仍然存在。