gpt4 book ai didi

c++11 - 单个 Lua 状态下的多个脚本并使用 _ENV

转载 作者:行者123 更新时间:2023-12-02 23:58:12 24 4
gpt4 key购买 nike

我目前正在学习如何使用 Lua C API,虽然我已经成功在 C/C++ 和 Lua 之间绑定(bind)函数,但我有几个问题:

  1. 将多个脚本加载到单个 lua_State 中是个好主意吗?有没有办法关闭特定的 block ?如果脚本不再使用,如何从 lua_State 中清除它,同时保留其他所有内容?

  2. 使用可能对函数/全局变量使用相同名称的脚本的最佳方法是什么?如果我加载所有这些,新的定义将覆盖旧的定义。

    在线阅读后我认为我需要分离每个加载的 block 进入不同的环境。我设想的工作方式是加载 block 时,我为其分配一个唯一的环境名称,当我需要使用它我只是使用该名称来获取来自 LUA_REGISTRYINDEX 的环境并执行操作。所以到目前为止我还没弄清楚如何做到这一点。网上有例子但他们使用 Lua 5.1。

最佳答案

Is it a good idea to load multiple scripts into a single lua_State?

是的,当然。除非这些脚本不相关并且应该在多个并行线程中运行。

Is there a way to close specific chunks?

Chunk 只是一个“函数”类型的值。当您没有将该值存储在任何地方时 - block 将被垃圾收集。
生成的任何 block - 全局变量或在外部某处有引用的局部变量 - 这些都将继续存在。

how to clear it from the lua_State while retaining everything else?

这取决于您如何看待该 block 。它只是一组函数,还是代表具有自己状态的某个实体。如果您不创建全局函数和变量,则单独脚本文件中定义的所有内容都将是 block 的本地内容,并且当没有对 block 的引用时将被删除。

What is the best way use scripts that may use the same name for functions/global variables?

考虑重写您的代码。不要创建任何全局变量,除非明确要求与程序的其他部分建立通信。将变量设置为本地变量(由 chunk 拥有),或者将其存储在将由 chunk 作为新对象返回的表/闭包中 - chunk 可能是生成新对象的工厂,而不仅仅是脚本。
此外,Lua 使用局部变量运行得更快。

The way I envision this working is each time a chunk is loaded I assign it a unique environment name

如果脚本来自外部(由用户编写或从其他外部来源接收),您应该这样做。沙盒很酷,但如果 block 是您的内部内容,则不需要沙盒。考虑重写没有全局变量的代码。如果您的 block 生成其他对象,则返回某个对象(api 表或闭包) - 您可以多次调用该 block 而无需重新加载它。或者保存一个全局模块接口(interface),如果 chunk 代表类似 Lua 的模块。如果你没有很好地组织你的代码,那么你将被迫使用单独的环境,并且你必须为每个脚本准备新的环境,复制基本的东西,如打印/配对/字符串/等。您将在运行时经历多次中断,直到您弄清楚新环境中还缺少什么,等等。

关于c++11 - 单个 Lua 状态下的多个脚本并使用 _ENV,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36356498/

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