6

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

是因为我以字典类型的方式使用数字键吗?还是因为 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

4

3 回答 3

15

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

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 允许s在形式中Name作为s,但不允许数字。数字必须在括号中。字段引用也是如此。你可以说fieldspecName = exp

dyeColor.black

但不是

dyeColor.0 -- you may say dyeColor[0] of course
于 2013-04-29T21:24:07.080 回答
0

#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
于 2013-04-30T09:19:27.460 回答
0

改进 Doug Curie 的解决方案:

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。

于 2013-04-30T09:46:40.940 回答