你可以在Lua表中使用数字键吗?

以下示例旨在创建一个可以在数字和字符串之间转换的表格,但无法运行。

这是因为我在字典类型的方式中使用了数字key吗? 还是因为lua从1开始进行表格索引?

有更好的方法来实现这个吗?

dyeColor = {
    0 =“黑色”,黑色= 0,
    1 =“红色”,红色= 1,
    2 =“绿色”,绿色= 2,
    3 =“褐色”,褐色= 3,
    4 =“蓝色”,蓝色= 4,
    5 =“紫色”,紫色= 5,
    6 =“青色”,青色= 6,
    7 =“浅灰色”,浅灰色= 7,
    8 =“灰色”,灰色= 8,
    9 =“粉色”,粉色= 9,
    10 =“石灰”,石灰= 10,
    11 =“黄色”,黄色= 11,
    12 =“浅蓝色”,浅蓝色= 12,
    13 =“品红”,品红= 13,
    14 =“橙色”,橙色= 14,
    15 =“白色”,白色= 15}

使用此在线解释器( [http://repl.it/languages/Lua](http://repl.it/languages/Lua)),它会给出错误

[string“stdin”]:2:'} expected(在第1行关闭'{')附近的“=”试图调用空值`

点赞
用户33252
用户33252

你需要把数字的索引放在方括号里:

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允许像 Name = exp 这样的 fieldspec 中的 Name 是字符串,但是不允许是数字。数字必须放在方括号中。字段调用也是一样的。你可以说

dyeColor.black

但是不能说

dyeColor.0 —— 当然你可以说 dyeColor[0]
2013-04-29 21:24:07
用户2328287
用户2328287

如果[0]包含在#dyeColor中,则未定义,因此可以使用以下代码:

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]包含在#dyeColor中,则未定义,因此可以使用以下代码:

2013-04-30 09:19:27
用户1850436
用户1850436
--改进Doug Curie的解决方案:
local dyeColor = {
    [0] = "black", --必须显式地设置0
    "red"        , --未命名的元素会在1开始自动获得数字索引
    "green"      ,
    "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。
2013-04-30 09:46:40