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

问题描述 投票:1回答: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}}

提前感谢

lua
2个回答
0
投票

您可以使用load函数以Lua代码的形式读取字符串的内容。

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

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


0
投票

为了快速解决方案,我建议使用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函数中,所以应该很容易对其进行修改以执行您想要的操作。

您必须适应的条件:

  • namenumber更改(并在没有lpeg.R('09')^1的情况下将模式相应地更改为/ '\0'
  • compile_tuple功能更改为build_table功能(local function build_tanle(...) return {...} end应该可以解决问题]
  • 尝试一下,看看是否需要更改其他内容;我可能错过了一些东西。

如果您对lpeg的工作原理感到好奇,可以阅读lpeg手册here。>

© www.soinside.com 2019 - 2024. All rights reserved.