私はパッケージに "autorequire"を作成しようとしています。つまり、Rubyが未知の定数に遭遇した場合、要求が成功すると中断した箇所に進みます。私が予想したように、それはHello, Hello, World!
を出力します未知の定数を要求して続行する
autoload {
print "Hello, "
x = ArrayFields.new
x << "World!"
puts x[0]
}
のようにこれを使用するのであれば
def autoload(&block)
yield
rescue NameError => e
if e.message[/constant/]
require e.name.to_s.downcase rescue LoadError raise
retry
end
raise
end
:今、私はこのような何かを持っています。したがって、定数の必要性を処理しますが、先頭から指定されたブロック全体を実行します。では、どのように失敗したのかを私はどのようにスキップしますか?これは主に学術的興味のためで、私はこのような試みのあらゆる危険にも興味があります。
元のエラー(初期化されていない定数)を保持するために、そのドキュメントで与えられた例を変更しました。しかし、なぜこれが1つのライナーとして機能しないのですか? 'ファイル救済が必要です。LoadError super.const_missing(name)'。 –
@Tatu:インラインレスキューのシンタックスは 'exp1レスキューexp2'です。これは、' begin require file rescue LoadError super.const_missing(name)end'と書かれています。インラインレスキューを使用して例外タイプを指定することはできません。 – sepp2k
それはタイプミス(構文は許可されていますが)でしたが、それとあなたのリマインダが私になぜそれが動作しないのかを理解させました。 LoadErrorはStandardErrorではないため、型のないレスキューではキャッチされません。後者の例でもこれを覚えておくと良いでしょう。レスキューが1行に書かれているかどうかにかかわらず、レスキューが自分の行になければ、常にインラインレスキューです。 –