関数を使用してチャンクをロードし、
func
そのピースを取得します。への各呼び出しはfunc
、前の結果と連結された文字列を返す必要があります。空の文字列、nil、または値が返されない場合は、チャンクの終わりを示します。
私のテストから、これは実際には真実ではありません。むしろ、ドキュメントは最小限の誤解を招くものです。
次のスクリプト例を検討してください。
function make_loader(return_at)
local x = 0
return function()
x = x + 1
if x == return_at then return 'return true' end
return nil
end
end
x = 0
repeat
x = x + 1
until not load(make_loader(x))()
print(x)
make_loader()
出力は、あきらめて何も返さない関数を返すnil
前に返された関数への連続した呼び出しの数ですload()
。
ドキュメントを額面どおりに受け取る場合、ここでの出力は「1」であると予想されます。ただし、出力は「3」です。これは、 への引数が、あきらめる前に3 回load()
戻るまで呼び出されることを意味します。nil
load()
一方、チャンク関数がすぐに文字列を返し、その後の呼び出しで、読み込みを停止するnil
のに 1 つしかかからない場合:nil
function make_loader()
local x = 0
return {
fn=function()
x = x + 1
if x == 1 then return 'return true' end
return nil
end,
get_x=function() return x end
}
end
loader = make_loader()
load(loader.fn)
print(loader.get_x())
これは、予想どおり「2」を出力します。
私の質問は次のとおりです。ドキュメントは間違っていますか? この動作は、何らかの理由で望ましいものですか? これは単なるバグload()
ですか?(意図的なように見えますが、その理由を説明するドキュメントは見つかりません。)