1.  lua的数据类型:
 nil(表示一个无效值),
 boolean,number(数字都是number类型的,双精度的实浮点数),
 string(字符串由一对双引号或单引号来表示,可以使用#来计算字符串长度,中文字符占2个字节),
 function(方法),
 userdata(自定义数据类型,数据结构),
 thread(线程,独立执行的线路,用于执行协同程序,),
 table(表,可以写成类,默认索引是1) 2.   ..是lua中的字符串连接符,当在一个数字后面写..时必须加上空格以防被解释错
3.  lua变量有三种类型:全局变量,局部变量(local),表中的域
4.  table的索引 a[12],a['sss'],(x=12,a[x]),a.kk,
5.  循环
 while(条件语句)
 do
   执行语句
 endfor i=x,y,z do  //z是可选可不选,不选默认为1
 执行语句
 enda={1,2,3}
 for i,v in ipairs(a)do
 执行语句
 endrepeat //先执行一次,再判断
 执行语句
 until (判断语句) 6.  goto  Label(标签)
 标签的格式为 ::Label::
 local a = 1
 ::label:: print("--- goto label ---")a = a+1
 if a < 3 then
     goto label   -- a 小于 3 的时候跳转到标签 label
 end7. 条件语句(lua认为false和nil为假)
  if(布尔表达式)then
 执行语句
 endif(布尔表达式)
 then
 执行语句
 else
 执行语句
 endif(布尔表达式)
 then
 执行语句
 elseif(布尔表达式)
 then
 执行语句
 end8.  函数,多返回值,可变参数(Lua 函数可以接受可变数目的参数,和 C 语言类似,在函数参数列表中使用三点 ... 表示函数有可变的参数。)
 function AA(x,y,z....)
 执行语句
 end9.  lua运算符  
 算术运算符  
 +  -  * / % ^ -
 关系运算符
 ==  ~=  <  >  <=  >=  
 逻辑运算符
 and  or  not
 其他运算符    ..  连接两个字符串    #返回字符串或者表的长度 10.  Lua字符串,字符串或串(String)是由数字、字母、下划线组成的一串字符。
    单引号间的一串字符。
     双引号间的一串字符。
     [[ 与 ]] 间的一串字符。转义字符  \a  \n.......
字符串操作   string.upper  string.lower  ......
 11.  数组
 数组,就是相同数据类型的元素按一定顺序排列的集合,可以是一维数组和多维数组。
 Lua 数组的索引键值可以使用整数表示,数组的大小不是固定的。12. 迭代器
 迭代器是一种对象,能够用来遍历元素,每个迭代器对象代表容器中的准确地址。
 在 Lua 中迭代器是一种支持指针类型的结构,它可以遍历集合的每一个元素。
 for k, v in pairs(t) do
     print(k, v)
 end
 使用了 Lua 默认提供的迭代函数 ipairs13.table(表)
 table是lua的一种数据结构用来帮助我们创建不同的数据类型如数组字典等
 table操作常用的方法:table.concat(table [, sep [, start [, end]]]),列出参数中指定table的数组部分从start位置到end位置的所有元素, 元素间以指定的分隔符(sep)隔开。
 table.insert(table, [pos,] value)
 table.remove (table [, pos])
 table.sort (table [, comp])14.lua模块与包
 模块类似于一个封装库,从 Lua 5.1 开始,Lua 加入了标准的模块管理机制,可以把一些公用的代码放在一个文件里,以 API 接口的形式在其他地方调用,有利于代码的重用和降低代码耦合度。Lua 的模块是由变量、函数等已知元素组成的 tableLua提供了一个名为require的函数用来加载模块。要加载一个模块,只需要简单地调用就可以了。例如:
 require("<模块名>")或者rrequire “<模块名>”15.Metatable(元表)  允许我们改变table的行为,每个行为关联了对应的元方法。
 有两个很重要的函数来处理元表:
     setmetatable(table,metatable): 对指定 table 设置元表(metatable),如果元表(metatable)中存在 __metatable 键值,setmetatable 会失败。
     getmetatable(table): 返回对象的元表(metatable)。mytable = {}                          -- 普通表
 mymetatable = {}                      -- 元表
 setmetatable(mytable,mymetatable)  或者mytable = setmetatable({},{})
  _index元方法
 mytable = setmetatable({key1 = "value1"}, {
   __index = function(mytable, key)
     if key == "key2" then
       return "metatablevalue"
     else
       return nil
     end
   end
 })Lua 查找一个表元素时的规则,其实就是如下 3 个步骤:
    1.在表中查找,如果找到,返回该元素,找不到则继续
     2.判断该表是否有元表,如果没有元表,返回 nil,有元表则继续。
     3.判断元表有没有 __index 方法,如果 __index 方法为 nil,则返回 nil;如果 __index 方法是一个表,则重复 1、2、3;如果 __index 方法是一个函数,则返回该函数的返回值。 16.    lua协同程序
 Lua 协同程序(coroutine)与线程比较类似
 线程与协同程序的主要区别在于,一个具有多个线程的程序可以同时运行几个线程,而协同程序却需要彼此协作的运行。在任一指定时刻只有一个协同程序在运行,并且这个正在运行的协同程序只有在明确的被要求挂起的时候才会被挂起。
协同程序有点类似同步的多线程,在等待同一个线程锁的几个线程有点类似协同。
coroutine.create()创建 coroutine,返回 coroutine, 参数是一个函数,当和 resume 配合使用的时候就唤醒函数调用
 coroutine.resume()(重启coroutine)
 coroutine.yield()(挂起coroutine)17.    lua文件I/O
 Lua I/O 库用于读取和处理文件。分为简单模式(和C一样)、完全模式。
 file = io.open (filename [, mode])简单模式
 -- 以只读方式打开文件
 file = io.open("test.lua", "r")
 -- 设置默认输入文件为 test.lua
 io.input(file)
 -- 输出文件第一行
 print(io.read())
 -- 关闭打开的文件
 io.close(file)
 -- 以附加的方式打开只写文件
 file = io.open("test.lua", "a")
 -- 设置默认输出文件为 test.lua
 io.output(file)
 -- 在文件最后一行添加 Lua 注释
 io.write("--  test.lua 文件末尾注释")
 -- 关闭打开的文件
 io.close(file)完全模式
 -- 以只读方式打开文件
 file = io.open("test.lua", "r")
 -- 输出文件第一行
 print(file:read())
 -- 关闭打开的文件
 file:close()
 -- 以附加的方式打开只写文件
 file = io.open("test.lua", "a")
 -- 在文件最后一行添加 Lua 注释
 file:write("--test")
 -- 关闭打开的文件
 file:close()