我看到了几篇关于在lua表中创建字符串的文章,但是我的问题有所不同[我认为],因为表还有一个额外的维度。
我有一个保存为文件的表表[我没有问题将文件读取为字符串]。
让我们从这一点开始:
local tot = "{{1,2,3}, {4,5,6}}"
当我尝试其他用户的答案时,我最终得到:
local OneDtable = {"{1,2,3}, {4,5,6}"}
这不是我想要的。
我如何正确创建一个表,其中包含那些表作为条目? 所需结果:
TwoDtable = {{1,2,3}, {4,5,6}}
预先感谢
答案 0 :(得分:1)
您可以使用load函数以Lua代码的形式读取字符串的内容。
local myArray = "{{1,2,3}, {4,5,6}}"
local convert = "myTable = " .. myArray
local convertFunction = load(convert)
convertFunction()
print(myTable[1][1])
现在,myTable具有二维数组中的值。
答案 1 :(得分:1)
对于快速解决方案,我建议使用load
hack,但是要注意,这仅在您的代码已经被格式化为Lua表的情况下才有效。否则,您必须自己解析该字符串。
例如,您可以尝试使用lpeg构建递归解析器。我前段时间构建了类似的东西:
local lpeg = require 'lpeg'
local name = lpeg.R('az')^1 / '\0'
local space = lpeg.S('\t ')^1
local function compile_tuple(...)
return string.char(select('#', ...)) .. table.concat{...}
end
local expression = lpeg.P {
'e';
e = name + lpeg.V 't';
t = '(' * ((lpeg.V 'e' * ',' * space)^0 * lpeg.V 'e') / compile_tuple * ')';
}
local compiled = expression:match '(foo, (a, b), bar)'
print(compiled:byte(1, -1))
其目的是将引号中的内容解析为示例字符串(foo, (a, b), bar)
,并将其转换为描述结构的二进制字符串;尽管大多数操作都发生在compile_tuple
函数中,所以应该很容易对其进行修改以执行您想要的操作。
您需要适应的条件:
name
更改为number
(并将模式相应地更改为lpeg.R('09')^1
,而无需使用/ '\0'
)compile_tuple
函数更改为build_table
函数(local function build_tanle(...) return {...} end
应该可以解决问题)如果您对lpeg手册的工作方式好奇,可以阅读lpeg手册here。