【问题标题】:are you allowed to have a numeric key in a lua table?您是否允许在 lua 表中使用数字键?
【发布时间】:2013-04-23 16:36:43
【问题描述】:

下面的例子应该做一个表格,可以在数字和字符串之间转换,然后再转换回来,但运行失败。

是因为我以字典类型的方式使用数字键吗? 还是因为lua从1开始表索引?

有没有更好的方法来做到这一点?

dyeColor = {
    0="black"    ,  black     = 0,
    1="red"      ,  red       = 1, 
    2="green"    ,  green     = 2,
    3="brown"    ,  brown     = 3,
    4="blue"     ,  blue      = 4,
    5="purple"   ,  purple    = 5,
    6="cyan"     ,  cyan      = 6,
    7="lightGray",  lightGray = 7,
    8="gray"     ,  gray      = 8,
    9="pink"     ,  pink      = 9,
    10="lime"     ,  lime      =10,
    11="yellow"   ,  yellow    =11,
    12="lightBlue",  lightBlue =12,
    13="magenta"  ,  magenta   =13,
    14="orange"   ,  orange    =14,
    15="white"    ,  white     =15}

使用这个在线解释器 (http://repl.it/languages/Lua) 会报错

[string "stdin"]:2: '}' expected (to close '{' at line 1) near '='attempt to call a nil value

【问题讨论】:

  • 它究竟是如何“运行失败”的?
  • 添加了我得到的错误信息。
  • 抵消了该问题的反对票之一,因为 OP 已经参与并确实表现出了一些努力。我自己不能抵消另一个,但即使我可以也可能不会,因为答案确实真的相当于阅读和理解语言本身的基本语法。

标签: dictionary lua lua-table


【解决方案1】:

您需要将数字索引放在括号中:

dyeColor = {
    [0]="black"     ,  black     = 0,
    [1]="red"       ,  red       = 1, 
    [2]="green"     ,  green     = 2,
    [3]="brown"     ,  brown     = 3,
    [4]="blue"      ,  blue      = 4,
    [5]="purple"    ,  purple    = 5,
    [6]="cyan"      ,  cyan      = 6,
    [7]="lightGray" ,  lightGray = 7,
    [8]="gray"      ,  gray      = 8,
    [9]="pink"      ,  pink      = 9,
    [10]="lime"     ,  lime      =10,
    [11]="yellow"   ,  yellow    =11,
    [12]="lightBlue",  lightBlue =12,
    [13]="magenta"  ,  magenta   =13,
    [14]="orange"   ,  orange    =14,
    [15]="white"    ,  white     =15}

您可以节省一些打字时间:

dyeColor = {
    [0]="black"     ,
    [1]="red"       ,
    [2]="green"     ,
    [3]="brown"     ,
    [4]="blue"      ,
    [5]="purple"    ,
    [6]="cyan"      ,
    [7]="lightGray" ,
    [8]="gray"      ,
    [9]="pink"      ,
    [10]="lime"     ,
    [11]="yellow"   ,
    [12]="lightBlue",
    [13]="magenta"  ,
    [14]="orange"   ,
    [15]="white"    }

for i = 0, #dyeColor do dyeColor[dyeColor[i]] = i end

Lua 允许Names 以Name = exp 的形式作为fieldspecs,但不允许数字。数字必须在括号中。字段引用也是如此。你可能会说

dyeColor.black

但不是

dyeColor.0 -- you may say dyeColor[0] of course

【讨论】:

  • 我会接受你的答案,如果你能解释你的答案与问题中给出的代码有何不同(从解释者的角度来看)
  • 除了[0]之外,您甚至可以通过不定义索引来节省更多输入。
  • 是的;在这种情况下,我将数字视为映射重要事实的文档,即,这不仅仅是一个数组,因此很高兴看到关联。当然,这是一个品味问题。
【解决方案2】:

#dyeColor 如果包含 [0] 则未定义,因此您可以

dyeColor = {} do
  local tmp= {
    "black"     ,
    "red"       ,
    "green"     ,
    "brown"     ,
    "blue"      ,
    "purple"    ,
    "cyan"      ,
    "lightGray" ,
    "gray"      ,
    "pink"      ,
    "lime"      ,
    "yellow"    ,
    "lightBlue" ,
    "magenta"   ,
    "orange"    ,
    "white"    
  }
  for i, v in ipairs(tmp) do
    local j = i - 1
    dyeColor[v], dyeColor[j] = j, v
  end
end

【讨论】:

  • 是否未为具有项 [0] 的表定义长度?我对 5.1 和 5.2 定义的阅读使我得出结论,它已定义,例如 5.2:对于某个整数 n,其正数字键的集合等于 {1..n}。我想这取决于您在这种情况下是否认为 0 是积极的。在 5.1 中,它肯定被定义:任何整数索引 n 使得 t[n] 不是 nil 并且 t[n+1] 是 nil -- 即使使用 [0] 也只有一个这样的值。
  • 我猜在这个解决方案中映射从 1 开始?如果是这样,这个答案是没用的,因为需要 0 来表示我无法控制的数据。
  • 哦。真的。 #dyeColor 如果包含 [0] 则定义。
【解决方案3】:

改进道格居里的解决方案:

local dyeColor = {
    [0] = "black", -- You must set 0 explicitly
    "red"        , -- Unnamed items get their numeric index 
    "green"      , -- automatically, starting at 1.
    "brown"      ,
    "blue"       ,
    "purple"     ,
    "cyan"       ,
    "lightGray"  ,
    "gray"       ,
    "pink"       ,
    "lime"       ,
    "yellow"     ,
    "lightBlue"  ,
    "magenta"    ,
    "orange"     ,
    "white"
}
for i = 0, #dyeColor do dyeColor[dyeColor[i]] = i end

尽管在 Lua 5.2 中未定义带有 [0] 的表的长度,但它实际上返回了最后一个元素的索引。上面的代码也适用于 Lua 5.1 和 LuaJIT。

【讨论】:

    猜你喜欢
    • 2021-09-07
    • 1970-01-01
    • 2010-11-05
    • 2015-11-30
    • 2012-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多