Lua 包括文件,覆盖变量

Lua 包括文件,覆盖变量,lua,Lua,我试图覆盖我的第一个.lua文件中的变量,方法是在我的代码末尾要求第二个打开 file1.lua val = 1 require "file2" file2.lua val = 2 print(val) _G.val = 2 print(val) 不幸的是,这似乎不起作用,因为val在这之后仍然是1。我提出的解决方案允许这些文件的潜在未来用户包括文件,这是一个新函数,我现在在初始化Lua时插入该函数: function include(file) dofile("path/sinc

我试图覆盖我的第一个.lua文件中的变量,方法是在我的代码末尾要求第二个打开

file1.lua

val = 1
require "file2"
file2.lua

val = 2
print(val)
_G.val = 2
print(val)
不幸的是,这似乎不起作用,因为val在这之后仍然是1。我提出的解决方案允许这些文件的潜在未来用户包括文件,这是一个新函数,我现在在初始化Lua时插入该函数:

function include(file)
    dofile("path/since_dofile_doesnt_seem_to_use/package/path" .. file .. ".lua")
end
这完全符合预期,但由于我还是Lua的新手,我想知道是否有更好的解决方案。也许已经有东西在里面了

更新:

我的问题是,我意外地多次需要file2,超过多个文件,Lua不会再次加载它来更改值。已解决。

在file2.lua中

print(val)
_G.val = 2
print(val)
输出应该是

一,


2

Lua在名为
package.loaded的表中跟踪代码中所需的所有文件。每次文件
require
d时,都会检查该表,如果表中已经存在模块名,则不会加载该表。如果表中不存在该模块,则加载该模块并将其名称添加到表中。通过这种方式,您可以多次
要求
一个模块,但它只会第一次运行


您可以通过在
require
ing包之后设置
package.loaded[packagename]=nil来解决此问题。这样,当lua检查表中是否存在包名时,它将找不到它,因此您可以根据需要多次使用它。

如果
val
是全局的,那么您的第一次尝试应该有效。没有“本地”,它应该是全局的。这也让我感到困惑。我刚刚在纯Lua中测试了这个,它在那里工作。。。?我正在用luaL_dofile运行file1,但它不起作用,这很奇怪。嗯,你必须发布你的C++代码,然后是的,lua会跟踪哪些文件被
require
d,所以你不能
require
同一个文件两次。@SethCarnegie,请将你的注释作为答案,以便将问题标记为“已回答”.也许如果你能更准确地描述一下你想要实现的目标,我可以为你指出更多正确的方向_G是内置的lua方式,用于访问/设置在本地或导入范围中创建的全局变量。你所做的任何其他事情都是对调用_G.var=values的美化包装。我不能对上面的帖子发表评论,但要回答需要回答的问题。。。lua有一个内置的防止require递归的机制。如果文件A需要文件B,而文件B需要文件A,当文件A加载时,它将加载文件B,直到文件B需要A为止。因此,如果您有一些功能需要在文件B中向文件A公开,那么代码必须在要求之前(“文件A”)。