有人可以解释const_missing在这种情况下的作用吗?

时间:2017-10-31 14:51:00

标签: ruby-on-rails ruby

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?那是什么目的?

1 个答案:

答案 0 :(得分:0)

  

为什么他们决定把它放在那里,考虑到我们知道@looked_for是零?

我们不知道。它可能已经有价值了。请记住,这是类对象上的实例变量。课程很长一段时间。

  

我的问题的主要缺点是,设置@looked_for[str_name] = 1

的目的是什么?

使用相同的参数短接const_missing的后续调用(因为我们已经尝试过并且没有找到匹配的常量)。同样,这是可能的,因为在@looked_for的调用之间const_missing仍然存在。