Lua里面的Table类似于C++里面的map,它里面的元素是一个键值对(key-value),所有的Table都可以用不同类型的索引来访问valu(值),当需要容纳新条目(entry)时,table会自动增长。Lua对于诸如a["name"]的写法提供了一种更简便的”语法糖(syntactic sugar)“,可以直接输入a.name
因此a.x= 10等同于a["x"]= 10,初学者常常会将a.x和a[x]搞错,前者表示a["x"],表示以字符串"x"来索引table,而后者是以变量x的值来索引table,见下面例子:
a= {}
x= "y"
a[x]= 10
print(a[x]) --10
print(a.x) --nil
print(a.y) --10
--其实总的来说,语法糖就是用a.x等同a["x"]
这个语法糖比较容易让初学者迷糊,但是联系到后面的table构造式之后,又让初始者更加迷糊,我们先来看table构造式:
构造式是用于创建和初始化table的表达式,是Lua最有用、最通用的机制之一。
如果只是指定了value而没有key。如: days= {"S", "M", "T", "W", "T", "F", "S"},那么"S"就默认为days[1]
然后Lua还提供了一种特殊的语法用来初始化记录风格的table
a= {x=10, y=20},这段chunk等于 a={}; a.x= 10; a.y= 20。看到这里我瞬间凌乱,Fuck Lua a.x不是”语法糖“么?
其实在Lua的语法中a= {x=10, y=20}等价于 a={["x"]=10, ["y"]= 20},有点繁琐扯蛋,这或许就是灵活性带来的坏处吧。