LUA:如何从字符串创建 2 维数组/表格

我看到了很多帖子都在将字符串转换为lua表,但我的问题有点不同[我想],因为这个表格有一个附加维度。

我有一个作为文件保存的表格,其中包含其他表格[我将这个文件读取到一个字符串中]。

假设我们从这一点开始: local tot = "{{1,2,3},{4,5,6}}"

当我尝试其他用户的答案时,我得到了: local OneDtable = {"{1,2,3}, {4,5,6}"}

这不是我想要的。

我该如何正确地创建一个表格,其中包含那些表作为条目? 期望的结果:

TwoDtable = {{1,2,3},{4,5,6}}

提前致谢

点赞
用户2725326
用户2725326

你可以使用load函数将字符串中的Lua代码作为内容读入。

local myArray = "{{1,2,3}, {4,5,6}}"
local convert = "myTable = " .. myArray
local convertFunction = load(convert)
convertFunction()
print(myTable[1][1])

现在,myTable具有一个二维数组中的值。

2019-10-25 09:39:25
用户4984564
用户4984564

为了快速解决问题,我建议使用 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 手册。

2019-10-25 09:54:24