gpt4 book ai didi

lua - 修改 Lua Chunk 环境 : Lua 5. 2

转载 作者:行者123 更新时间:2023-12-04 22:26:02 25 4
gpt4 key购买 nike

据我了解,在 Lua 5.2 中,环境存储在名为 _ENV 的上值中。这让我很难在运行之前修改 block 的环境,但在加载它之后。

我想加载一个包含一些函数的文件,并使用 block 将这些函数注入(inject)到各种环境中。示例:

chunk = loadfile( "file" )

-- Inject chunk's definitions
chunk._ENV = someTable -- imaginary syntax
chunk( )

chunk._ENV = someOtherTable
chunk( )

在 Lua 中这可能吗?我能找到的修改这个上值的唯一例子是 with the C api (另一个 example from C api ),但我正在尝试从 Lua 中执行此操作。这可能吗?

编辑:我不确定是否接受使用调试库的答案。 docs state功能可能很慢。我这样做是为了提高效率,这样就不必为了将变量定义注入(inject)各种环境而从字符串(或文件,甚至更糟)中解析整个 block 。

编辑:看起来这是不可能的:Recreating setfenv() in Lua 5.2

编辑:我认为对我来说最好的方法是绑定(bind)一个可以修改环境的 C 函数。尽管这是一种更烦人的方式。

编辑:我相信更自然的方法是将所有 block 加载到单独的环境中。通过设置引用 block 的全局副本的元表,这些可以被任何其他环境“继承”。这不需要任何上值修改后加载,但仍然允许具有这些函数定义的多个环境。

最佳答案

允许 block 在不同环境中运行的最简单方法是使其显式化并让它接收一个环境。在 block 的顶部添加这一行实现了这一点:

_ENV=...

现在您可以随意调用 chunk(env1) 和稍后的 chunk(env2)

那里,没有上值的debug魔法。

虽然您的 block 是否包含该行很清楚,但您可以在加载时添加它,方法是编写一个合适的读取器函数,该函数首先发送该行,然后发送文件的内容。

关于lua - 修改 Lua Chunk 环境 : Lua 5. 2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20735570/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com