我正在尝试为一个包创建“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!
。因此它处理常量的需求,但从头开始执行整个给定的块。那么如何跳转到发生故障的位置?这主要是出于学术兴趣,所以我也对这种尝试中的任何危险感兴趣。
答案 0 :(得分:3)
无法跳转到rescue-clause异常之前的那一点。做你想做的更可行的方法是覆盖const_missing
。
答案 1 :(得分:0)
Ruby有自动加载,至少存在于Ruby 2.0中。