需要一个未知的常数并继续

时间:2011-12-09 11:53:10

标签: ruby

我正在尝试为一个包创建“autorequire”,即如果Ruby遇到一个未知的常量,它会尝试要求它,并在需要成功的情况下继续它停止的地方。现在我有这样的事情:

def autoload(&block)
  yield
rescue NameError => e
  if e.message[/constant/]
    require e.name.to_s.downcase rescue LoadError raise
    retry
  end
  raise
end

所以,如果我使用它

autoload {
   print "Hello, "
   x = ArrayFields.new
   x << "World!"
   puts x[0]
}

正如所料,它将打印Hello, Hello, World!。因此它处理常量的需求,但从头开始执行整个给定的块。那么如何跳转到发生故障的位置?这主要是出于学术兴趣,所以我也对这种尝试中的任何危险感兴趣。

2 个答案:

答案 0 :(得分:3)

无法跳转到rescue-clause异常之前的那一点。做你想做的更可行的方法是覆盖const_missing

答案 1 :(得分:0)

Ruby有自动加载,至少存在于Ruby 2.0中。