0

ファイルにいくつかの lua コードがあります。このコードの複数のクロージャ インスタンスを作成し、それぞれに異なる _ENV 上位値を設定したいと考えています。luaL_loadfileを使用してファイルをロードし、最初の上位値を異なるテーブルで N 回設定して、N 個のインスタンスを作成できます。しかし、これはファイルをN回ロードしてコンパイルしませんか?

ロードファイルがない場合を除いて、私がやりたいことと同等のluaは次のとおりです

func_list = {}

for i = 1, 10 do
    local new_env = {hello=i, print=print}
    func_list[i] = loadfile("Code.lua", "t", new_env)
end

for i = 1, 10 do
    func_list[i]()
end

------ Code.lua ------
print(hello*hello)

これを行うより良い方法はありますか?

4

2 に答える 2

1

Lua で文字列/ファイルをロードするたびに、実際にファイルを実行するために呼び出す関数が返されます。あなたにとって何loadをするかは、_ENV.

ただし、自分で設定することを妨げるものは何もありません_ENV。次のようなものでそれを行うことができます:

-- Code.lua --
_ENV = ...
print(hello * hello)

次に、ファイルを一度だけロード/コンパイルし、複数のインスタンスを使用できます。

local code = loadfile("Code.lua")

env_list = {}
for i = 1, 10 do
    local new_env = {hello=i, print=print}
    code(new_env)
    env_list[i] = new_env
end

ユーザーがすべてのファイルに書き込む必要がない場合は_ENV = ...、代わりにファイルを文字列にロードし、自分で行を前に追加してload、ソースをコンパイルするために使用できます。しかし、これはコンパイルされたファイルでは機能しません。

于 2012-06-11T08:40:42.957 に答える
1

IO ライブラリを使用してファイルを文字列にロードし、それを呼び出しますloadstring

または、チャンクを1つ取得して、実行する前にenvを変更します

于 2012-06-11T04:55:36.747 に答える