Lua脚本语言入门

一、注释

“--”为注释一行

“--[[” 开头到 “]]”结尾为注释一段,在注释中“[[”和“]]”是可以嵌套的

二、LUA

语句之间使用空格或者分号“;”隔开,如果多个语句写在同一行,建议用分号隔开。

条件控制语句:

  if 条件 then ... elseif 条件 then ... else ... end

while循环:

  while 条件 do ... end

Repeat循环:

  repeat ... until 条件

For循环:

  for 变量=初值,终值,步长 do ... end

  for 变量1,...,变量N in 表或枚举函数 do ... end

注意,for的循环变量只作用于for语句快,也可以省略步长,默认为1,可以用break来终止一个循环。

语句块:

  使用do和end来包裹一个语句块,你可以在函数和语句块中声明局部变量。

赋值语句:

  同时给多个变量赋值 a,b,c,d = 1,2,3,4

  甚至是 a,b=b,a 方便交换a,b的值

  默认情况下变量都是全局的,如果要定义局部变量要使用local说明,local a,b,c=1,2,3 则a,b,c都是局部变量

数值运算:

  与C一样的+,-,*,/,还多了一个^阶乘,比如2^3=8

  连接两个字符串可以用..运算符"this is a ".."apple"

比较运算符:

  <,>,<=,>=,==,~= 这些操作总是返回true或者false

  对于Table,function,userdata这些类型的数据只能使用==,~=,表示两者是否引用的同一数据

  a={1,2};b = a; print(a == b , a ~= b);--------true,false

  a={1,2};b={1,2};print(a == b , a ~= b);--------false,true

逻辑运算:

  and,or,not

  在Lua中只有false和nil才算作false,其他任何数据都为true,0也是true

  and,or的结果不是true,false;而是和运算两数有关,

  a and b,a为true则结果为b,a为false则结果为a

  a or b,a为true则结果为a,a为false则结果为b

  举几个例子:

  print(4 and 5);----5

  print(nil and 13)----nil

  print(false and 13)---false

  print(4 or 5)---4

  print(false or 5)---5

  模拟三目运算x=a?b:c在Lua中可以写成x=a and b or c

  x = x or v 等于 if not x then x= v end;

运算符优先级:

  ^

  not (一元运算)

  *,/

  +,-

  .. (字符串连接)

  <,>,<=,>=,==,~=

  and

  or

关键字:

  and, break,do,while,break,for,then,end,repeat,for,if,else,elseif,until,not,or,false,nil,local,function,return,true

变量类型:

  NIL空值,没有用过的变量,nil既是值有是类型

  Boolean 布尔值

  Number 数值相当于double

  String 字符串,可以包涵“\0”的

  Table 关系表

  Function 函数类型,所有的函数本身就是一个变量

  Userdata用户数据类型,可以是宿主的任意类型,宿主主要是C或C++,比如struct,指针等

  Thread 线程类型,其实Lua是没有线程的,但是Lua可以将一个函数分成几部执行

变量定义:

  默认变量的范围是全局的,所以在函数或者语句块中要定义局部变量要加local关键字

  变量是大小写敏感的

  例子:

  如果要将一个变量消除可以使用 v=nil,注意小写nil

  可以直接赋值一个boolean类型,v=true

  字符串使用单引号或双引号赋值,v='this is single';v="there are double",支持与C一样的转义\n \t等

  也可以用[[ ]]将字符串括起来,例如:

  page = [[<HTML>

        <head></head>

      </HTML>]]

  如果字符串里面有[,]可以使用\转义

  Table类型可以理解为一个数组,除了nil都可以做索引,也可以用任意的数据类型做内容,除了nil,用{}括起来就是table了

  T1 = {} ---空数组

  T1[1] = 10

  T1["John"] = {age=27,Gender="male"}

  这一句相当于

  T1["John"] = {}

  T1["John"]["age"]=27

  T1["John"]["Gender"]=male

  当表的索引是字符串的时候,可以简写为:

  T1.John={}

  T1.John.age=27

  T1.John.Gender=male

  或

  T1.John{age=27,Gender="male"}

  推荐表的赋值写法:

  T1 =

  {

    10, ---相当于[1]=10

    [100] = 40,

    John=

    {

      age = 27,

      Gender = male

    },

    20 ---相当于[2]=20

  }

  需要注意三点,第一,所有元素之间总是用,号隔开;

  第二,所有的索引都要用[]括起来,字符串可以不用,也可以用

  第三,如果不写索引,默认从1开始递增

  Function函数定义很简单,

  function add(a,b) --add是函数名,a,b是参数

    return a+b

  end

  注意,return一定要写在end之前,上面的语句相当于:

  add = function (a,b) return a+b end

  函数接受可变参数使用...来定义,比如

  function sun(a,b,...)

  取得可变参数在函数中访问arg局部变量得到,他是个表类型

  如:sum(1,2,3,4)则,a= 1,b=2,arg={3,4}

  函数也可以同时返回多个结果,比如:

  function s()

    return 1,2,3,4

  end

  a,b,c,d = s() --相当于a=1,b=2,c=3,d=4

Lua的面向对象特性:

  t=

  {

    age =27,

    add = function(self, n) self.age = self.age + n end

  }

  print(t.age)

  t.add(t,10) ----  可以简写为t:add(10)

  print(t.age)

参考手册http://archive.cnblogs.com/a/897304/

一个for的例子:

myData = {}

myData[0] = "foo"

myData[1] = 42

myData["bar"]= "baz"

for key ,value in myData do

  print(key .. "=" .. value)

end

结果输出:

0=foo

1=42

bar=baz