【发布时间】:2014-01-11 04:50:15
【问题描述】:
据我了解,在 Lua 5.2 中,环境存储在名为 _ENV 的上值中。这让我在运行之前修改块的环境感到非常困惑,但在加载它之后。
我想加载一个包含一些函数的文件,并使用该块将这些函数注入到各种环境中。示例:
chunk = loadfile( "file" )
-- Inject chunk's definitions
chunk._ENV = someTable -- imaginary syntax
chunk( )
chunk._ENV = someOtherTable
chunk( )
这可以在 Lua 中实现吗?我能找到的修改这个upvalue的唯一例子是with the C api(另一个example from C api),但我试图在Lua中做到这一点。这可能吗?
编辑:我不确定是否接受使用调试库的答案。 docs state 表示功能可能很慢。我这样做是为了提高效率,这样就不必为了将变量定义注入各种环境而从字符串(或文件,甚至更糟)中解析整个块。
编辑:看起来这是不可能的:Recreating setfenv() in Lua 5.2
编辑:我想最好的方法是绑定一个可以修改环境的 C 函数。虽然这是一种更烦人的方式。
编辑:我相信更自然的方法是将所有块加载到单独的环境中。这些可以通过设置引用块的全局副本的元表被任何其他环境“继承”。这不需要在加载后进行任何上值修改,但仍然允许具有这些函数定义的多个环境。
【问题讨论】:
-
请注意,在您插入的链接中,有一个comment by one of Lua authors
-
我看到了评论,但我几乎不知道他的意思。我没有5.1的经验来理解。 @akavel
-
呃,实际上我也不是 100% 确定,但据我了解,在实践中,这大致意味着您似乎已经从其他人那里得到了什么:通过调试库或 C API 是可行的(事实上,debug 确实使用了 C API),尽管它故意变得有点困难和不明显,因此它不会在常规的日常 Lua 代码中被过度使用。来自 lhf 的答案具有很高的可信度,并且可以洞察原始意图。
标签: lua