Lua有大小写之分,"and"是一个保留字,但"And"和"AND"却是两个不同的标识符
Lua行注释 --
Lua块注释 --[[       --]]
Lua有8种基础类型:nil(空)、boolean(布尔)、number(数字)、string(字符串)、userdata(自定义类型)、function(函数)、thread(线程)和table(表)。含数type可根据一个值返回其类型名称。
print(type("Hello world"))     -->string
print(type(10.4*3))              -->number
print(type(print))                  -->function
print(type(true))                  -->boolean
print(type(nil))                     -->nil
print(type(type(x)))              -->string
最后一行将永远返回"string",而无关乎X这个值的内容。这是因为type函数总是返回一个字符串。
变量没有预定义的类型,任何变量都可以包含任何类型的值:
print(type(a))                         -->nil(a尚未初始化)
a = 10
print(type(a))                        -->number
a = "a string!!"
print(type(a))                         -->string
a = print                                -->是的,这是合法的!
a(type(a))                              -->function
请注意最后两行。在Lua专用,函数是作为“第一类值(first-class value)”来看待的,可以像操作其他值一样来操作一个函数值。
将一个变量用于不同的类型,通常会导致混乱的代码,但有时明智地使用这种特性会带来便利。例如,在异常情况下,可以返回一个nil以区别于其他正常的返回值。
在Lua中,table既不是“值”也不是“变量”,而是“对象”。可以将一个table想象成一种动态分配的对象,程序仅持有一个对它们的引用(或指针),Lua不会暗中产生table的副本或创建新的table。此外,在Lua中也不需要声明一个table。事实上也没有办法可以声明table。table的闯将是通过“构造表达式(constructor expression)”完成的,最简单的构造表达式就是 {} 。
a = {}              --创建一个table,并将它的引用存储到a
k = "x"             
a[k] = 10        --新条目,key = "x", value = 10
a[20] = "great"    --新条目,key = 20, value = "great"
print(a["x"])         -->10
k = 20
print(a[k])           -->"great"
a["x"] = a["x"] + 1     --递增条目"x"
print(a["x"])            -->11
 
table永远是“匿名的(anonymous)”,一个持有table的变量与table自身之间没有固定的关联性。
 
a = {}
a["x"] = 10
b = a               -- b与a引用了同一个table
print(b["x"])       -->10
b["x"] = 20
print(a["x"])         -->20
a = nil               -- 现在只有b还在引用table
a = nil              --再也没有对table的引用了
当一个程序再也没有对一个table的引用时,Lua的垃圾收集器(garbage collector)最终会删除该table,并复用它的内存。
所有table都可以用不同类型的索引来访问value,当需要容纳新条目(entry)时,table会自动增长。
 
a.x = 10                  --等同于a["x"] = 10
print(a.x)                 --等同于print(a["x"])
print(a.y)                 --等同于print(a["y"])
不要将a.x和a[x]搞错。前者表示a["x"],表示以字符串"x"来索引table。而后者是以变量x的值来索引table。下例说明了这种区别:
a = {}
x = "y"
a[x] = 10               --将10放入字段"y"
print(a[x])              -->10     --字段"y"的值
print(a.x)                -->nil    --字段"x"(未定义的)的值
print(a.y)               -->10    --字段"y"的值
 
就Lua的习惯而言,数组通常以1作为索引的起始值,并且有不少机制依赖于这个惯例。
长度操作符"#"用于返回一个数组或线性表的最后一个索引值(或为其大小)。
以下是几种长度操作符在Lua中的习惯写法:
print(a[#a])               --打印列表a的最后一个值
a[#a] = nil                 --删除最后一个值
a[#a+1] = v              --将v添加到列表末尾
 
a = {}
a[10000] = 1
print(table.maxn(a))            -->10000