6

Lua 5.1ドキュメントからload()

関数を使用してチャンクをロードし、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()ですか?(意図的なように見えますが、その理由を説明するドキュメントは見つかりません。)

4

2 に答える 2