【问题标题】:LUA: How to Create 2-dimensional array/table from stringLUA:如何从字符串创建二维数组/表
【发布时间】:2019-10-25 17:54:24
【问题描述】:

我看到几篇关于在 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


【解决方案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 具有二维数组中的值。

【讨论】:

  • 这很漂亮 - 谢谢,我不知道那个。我才刚刚开始我的 Lua 之旅……很有趣。
【解决方案2】:

对于快速解决方案,我建议使用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 手册 here

【讨论】:

  • 感谢您的支持——不过,这已经超出了我目前的需要。一定要把它放在后袋里。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-07-07
  • 1970-01-01
  • 2016-08-10
  • 2014-04-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多