Redis之与redis关联使用的脚本lua的基本语法

来源:互联网 发布:wow数据库 编辑:程序博客网 时间:2024/06/05 10:38

lua脚本的语法说明:

lua基本介绍:

lua的语法比较简单,学习起来业比较省力,但功能却并不弱。所以,我只简单的归纳一下lua的一些基本语法规则,使用起来方便好查就可以了。(在lua中,一切都是变量,除了关键字。)

1.注释

在程序中,总少不了注释。在lua中,你可以使用单行注释。

(1)单行注释:连续两个减号“--”表示注释的开始,一直延续到行末为止。相当于c++语言中的“//”。

(2)多行注释:由“--[["表示注释开始,并且一直延续到"]]"为止。这种注释相当于c语言中的“/*.....*/”。"[["和"]]是可以嵌套的(在lua5.1中,中括号中间是可以加若干个"=="的,如[==

[==[...]==]),见下面的字符串表示说明。


2.lua编程

经典的“hello world”的程序总是被用来开始介绍一种语言。在lua中,写一个这样的程序很简单:

在lua中语句之间可以用分号";"隔开,也可以用空白隔开。一般来说,如果多个语句卸载同一行的话,建议总是用分号隔开。

lua有好几种程序控制语句,如:

控制语句                                                                                   格式                                                                        示例

if                                                                        if条件 then...else 条件 then...else... end              if 1+1=2 then print("true")

                                                                                                                                                           elseif  1+2~=3 then print("true")

                                                                                                                                                           else print("false") end 



While                                                                  while 条件 do...end                                                    while 1+ 1=2  do print("true")end


Repeat                                                               repeat...until 条件                 repeat print("hello") until 1+1~=2


For                                                                    for 变量=初值,终点值,步进do... end                      for i=1,10,2 do print(i) end


For                                                                    for 变量1,变量2,........变量n  in表示或枚举函数 do...end              for a ,b in mylist do print(a,b) end


注意一下,for的循环变量总是只作用于for的局部变量;当省略步进值时,for循环会使用1作为步进值。

使用break可以用来中止一个循环。相对于C语言来说,Lua有几个地方是明显不同的,所以面要特别注意一下:


.语句块

语句块在C中是和"{"和"}"括起来的,在Lua中,它是用来do和end括起来的,比如:

do print("Hello") end

可以在函数中和语句块中定局部变量


 .赋值语句

赋值语句在lua被强化了。它可以同时给多个变量赋值。

例如:

a,b,c,d = 1,2,3,4

甚至是:

a,b= b,a --多么方便的变换功能啊。

在默认情况下,变量总是认为全局的。假如需要定义全局变量,则在第一次赋值的时候,需要local说明

比如:local a,b,c =1,2,3 --a,b,c都是局部变量


.数值运算

和C语言一样,支持+,-,*,/。但是lua多了一个"^",.这表示指数乘法运算。比如2^3结果为8,2^4= 16.

连接两个字符串,可以用".."运处符。如: "this a" .."string." -- 等于“this is a string”



.比较运算

比较符号                   <      > <=   >===      ~=

含义 小于大于小于等于大于等于相等不相等


所有这些操作符总是返回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,not ,or

其中,and 和or 与C语言区别特别大

在这里,请先记住,在lua中,只有false和nil才计算为false,其他任何数据都计算为true,0也是true!

and 和 or 的运算结果不是true和false ,而是和它的两个操作数相关。

a and b :如果a为false,则返回a;否则返回b

a or  b   :如果a为true,则返回a;否则返回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


在lua中这是很有用的特性,也是比较令人混淆的特性。

我们可以模拟C语言中的语句:X =a?b:c ,在lua中,我们可以写成 x=a and b or c.

最有用的语句是:x = x or v ,它相当于:if not x then x=v end。


.运算符优先级,从低到高顺序如下:

or 

and

<   >  <=>=~= ==

..(字符链接)

+ -    

*    /      %

not      # (lua5.1取长度运算)-(一元运算)

^



3.关键字

关键字是不能作为变量的。lua的关键字不多,就下面几个

and break              doelse    elseif

end  false for  function if

in localnil not or

repeat  return    thentrueuntil while




4,变量类型

怎么确定一个变量是什么类型呢?大家可以使用type()函数来检查。lua支持的类型有一下几种:

Nil       空值,所有没有使用过的变量,都是nil。nil即是值,又是类型

Boolean         布尔值,只有两个有效值:TRUE和false

Number        数值,在lua里,数值相当于C语言的double

String   字符串,如果你愿意的话,字符串可以包含"\0"字符的(这和C语言总是以"\0"结尾是不一样的)

Table 关系表类型,这个功能比较强大,请参考后面的内容。

Function      函数类型,不要怀疑,函数也是一种类型,也就是说,所有的函数,它本身都是一种类型

UserData       这个类型专门用来和lua的宿主打交道的。宿主通常是用C和C++来编写的,在这种情况下,Userdata可以使宿主的任意数据类型,

常用的有Struct和指针。



Thread   线程类型。在lua中没有真正的线程,lua可以将一个函数分成几部分运行。如果感兴趣的话。可以去看看lua的文档。也跟遍历函数有点相似。

如:

function    range(n)

local i = 0

while(i<n) do

coroutine.yield(i)

i=i+1;

end

end





5.变量的定义

所有的语言,都用到变量。在lua中,不管在什么地方,都不需要声明,并且所有的这些变量总是全局变量,除非我们在前面加上"local"。这点要特别注意。因为我们可能

想在函数中使用局部函数,却忘了用local来说明。

至于变量的名字,他是大小写相关的。也就是说,A和a是两个不同的变量。

定义一个变量的方法就是赋值。“=”操作就是用来赋值的

我们一起来定义几种常用类型的变量吧。

A.   Nil

正如前面所说的,没有使用过的变量的值,都是Nil。有时候我们也需要将一个变量清除,这时候,我们可以直接给变量赋值nil值。如:

var 1= nil  --请注意 nil 一定要小写


B.Boolean

布尔值通常是用在进行条件判断的时候。布尔值有两种true和false .在lua中,只有false和nil才被计算为FALSE,而所有任何其他类型的值,都是true,比如o,空字符串

等。都是true。不要被C语言的习惯所误导,0在lua中的确是true,你也可以直接给一个变量赋以Boolean类型的变量,如:

theBoolean = true

    

C.Number  

在lua中,是没有整数类型的,也不需要,一般情况下,只要数值不是很大(比如不超过100.000.000.000.000),是不会产生误差的,在windowsxp能跑的当今主流PC上,

实数的运算并不比整数慢。

实数的表示方法,同C语言类似,如:

4 0.4 4.57e-3  0.3e12 5e+20


D.String

字符串,总是一种非常常用的高级类型。在lua中,我们可以非常方便的定义很长很长的字符串。

字符串在lua中有几种方法来表示,最常用的方法,是用双引号或单引号来扩起一个字符串的,如:"That's go!"或 "hello world"

和C语言相同的,它支持一些转义字符,列表如下:

\a  bell

\b back space

\f  form feed

\n carriage return 

\t horizontal

\v vertical

\\ backslash

\"double quote

\"single quote

\"left  square bracket

\"right square bracjet

由于这种字符串只能卸载一行中,因此,不可避免的要用到转译字符。加入转译字符的串,看起来是在是不敢恭维




E. Table  

关系表类型,这是一种很强大的类型。我们可以把这个类型看做是一个数组,只是C语言的数组,只能用正整数来做索引;在lua中,你可以用任意类型来做数组的索引,

除了nil,同样,在c语言中,数组的内容只允许一种类型;在lua中,你也可以用任意类型的值来做数组的内容,除了nil.

      Tabel 的定义很简单,它的主要特征是用{"和"}来括号一系列数据元素的,比如:

     T1 = {}  --定义一个空表

     T1[1] = 10  --然后我们可以向C语言一样来使用它

     T1["john"] = {age=27,gender="male"}

这一句话相当于

   T1['john'] = {}   --必须先定义成一个表,还记得未定义的变量是nil类型吗?

   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的定义,我们可以这么写:

T1= 

  {

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

      [100] = 40 ,

     john = --如果你愿意。你还可以写成:["Age"] = 27

     {

        age = 27, --如果你愿意,你还可以写成:["age"] = 27

        gender =male   --如果你愿意,你还可以写成:["gender"] = male

    }

        20 -- 相当于[2] = 20

 }

在此我们需要提醒几点:

一:所有元素之间,总是用逗号","隔开

二:所有索引值需要用["和"]括起来;如果是字符串。还可以去掉引号和中括号;

三:如果不写索引,则索引就会被认为是数字,并按顺序自动从1往后编;



表类型的构造是如此的方便,以至常常被人用来代替配置文件。是的,不用怀疑,它比ini文件要漂亮,并且要强大很多



F.Function 函数,

在lua中,函数的定义也很简单,典型的定义如下:

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

         return  a+b  --return  用来返回函数的运行结果

end


请注意,return 语言一定要写在end之前,假如我们非要在中间放上一句return,那么就应该写成: do return end

还记得前面说过,函数也是变量类型吗?上面的函数定义,其实相当于:

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

当重新给add赋值时,它就不再表示这个函数了。我们甚至可以赋值给add任意数据,包括nil(这样,赋值为nil,将会把变量清除)。function 是不是很象C语言的函数指针?

function sum(a,b...)

如果想取得...所代表的参数,可以在函数中访问arg局部变量(表类型)得到(lua5.1: 取消arg,并直接用"..."来代表可变参数了,本质还是arg)。

如 sum(1,2,3,4)

  则,在函数中,a = 1, b = 2, arg = {3, 4}  (lua5.1:  a = 1, b = 2, ... = {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+end
    }
    
print(t.Age)  -- 27
    t.add(t, 10)
    
print(t.Age)  -- 37


不过,t.add(t,10) 这一句实在是有点土对吧?没关系,在Lua中,我们可以简写成:

t:add(10)    -- 相当于 t.add(t,10)


 G.  Userdata 和 Thread
    这两个类型的话题,超出了本文的内容,就不打算细说了。



以上就是整个lua脚本基本语法部分!

原创粉丝点击