2013-04-29 64 views
0

以下示例应该创建一个表,该表可以在数字和字符串之间进行转换,然后再次返回,但无法运行。是否允许在lua表中使用数字键?

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

+0

它究竟如何“失败”? – 2013-04-29 21:22:29

+0

添加了我收到的错误消息。 – 2013-04-29 21:28:16

+0

抵消了问题的一个问题,因为OP已经参与并且显示出一些努力。无法抵消其他我自己,但即使我能做到也不会,因为答案*确实能够阅读和理解语言本身的基本语法。 – RBerteig 2013-04-29 22:39:10

回答

4

你需要把数字指标括号:

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 s作为fieldspec s的形式Name = exp但不是数字。数字必须在括号内。现场参考也是如此。你可能会说

dyeColor.black 

但不

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

我会接受你的答案,如果你能解释你的答案与问题中给出的代码有什么不同(从解释者的角度来看) – 2013-04-29 21:27:40

+0

你甚至可以通过不定义索引来节省更多的输入,除了'[0]'。 – hjpotter92 2013-04-29 22:49:08

+1

是的;在这种情况下,我将这些数字视为映射有意义的事实的文档,即,这不仅仅是一个数组,所以很高兴看到这个关联。当然,这是一个品味问题。 – 2013-04-30 16:53:52

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 
+0

具有项目[0]的表的长度未定义?我对5.1和5.2定义的阅读使我得出结论,例如5.2:对于某个整数n,其正数字键集等于{1..n}。我想这取决于你在这方面是否考虑0积极。在5.1中,它肯定是定义的:任何整数索引n使得t [n]不是nil且t [n + 1]是零 - 即使使用[0]时也只有一个这样的值。 – 2013-04-30 17:01:58

+0

我在这个解决方案中猜测映射从1开始?如果是这样,这个答案是无用的,因为需要0代表我无法控制的数据。 – 2013-05-01 05:34:05

+0

哦。真。如果它包含[0],则定义#dyeColor。 – moteus 2013-05-07 11:44:02

0

提高道格·居里的解决方案:

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 

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

相关问题