我在表格中遇到变量问题。这是必不可少的,因为我使用表作为我的程序的配置。
所以我测试了以下有效的代码:
> x = "X"
> t = {["ref"]="table with value: "..x}
> print(t["ref"])
table with value: X
> x = "Y"
> t = {["ref"]="table with value: "..x}
> print(t["ref"])
table with value: Y
然而,如果没有第二个> t = ["ref"]="table with value: "..x
,它就无法运作
现在我把它实现到我的主程序中,由两个文件组成,一个女巫返回配置表。还有一个包含所有功能和内容的文件。它看起来如下
文件A(main.lua):
testString = "test1"
print(testString)
local CONFIG = require'config'
print(CONIFG[1].test)
testString = "test2"
print(testString)
local CONFIG = require'config'
print(CONIFG[1].test)
文件B(config.lua):
local CONFIG = {
{["test"]=[[this is a test: ]]..testString}
}
return CONFIG
现在当我运行文件A(a.k.a.main.lua)时,我得到以下输出:
test1
this is a test: test1
test2
this is a test: test1
我无法弄清楚我在这里做错了什么..我认为这与单个字符串有关,所以我把testString
作为一个表,但这给了我相同的结果...
(这个标题真的很吓人......对不起)
答案 0 :(得分:4)
require
按设计缓存返回值。因此,如果使用相同的字符串调用require
,则不会再次执行脚本。它只会返回先前返回的值。
require
用于加载模块。并且模块不应该根据其他全局状态更改其返回值。
您可能正在寻找的功能是dofile
。这将始终加载并执行该文件(但它没有require
的路径搜索属性)。或者,您可以使用loadfile
将文件作为函数加载,然后执行该函数以随时重新生成表。
此外:
我在表格中遇到变量问题。
表格中没有"变量"。或者至少不是你的意思。期望对变量进行更改以影响其他值,就像期待这样:
a = 5
b = a + 5
a = 10
assert(b == 15, "This will never be true.")
当评估表达式(a + 5
或"table with value: " .. x
)时,它会产生一个值。结果值决不依赖于生成它的表达式中的任何值或变量。
这就是你必须重新生成价值的原因;因为价值观不会因为某些变量而发生变化。