Kong网关:入门、实战与进阶
上QQ阅读APP看书,第一时间看更新

3.4 表达式语句

Lua支持与其他大多数编程语言类似的编程语句,包括赋值语句、控制语句、函数调用语句等。函数调用在上文已有介绍,此处着重分析赋值语句和控制语句。

3.4.1 赋值语句

赋值是改变一个变量的值和表域的最基本方法。Lua可以同时对多个变量进行赋值。语法定义是等号左边放一个变量列表,等号右边放一个表达式列表,各个元素之间使用逗号分隔开。赋值语句右边的值会赋给左边的变量。Lua程序在执行过程中遇到赋值语句会先计算右边的值,然后根据右边的值执行赋值操作。赋值过程中可能会遇到两种情况。第一种情况:当左边变量的个数大于右边值的个数时,Lua程序会依次进行赋值。没有值与之变量对应时,默认为其赋值nil。最终左边变量都有一个值。第二种情况:当左边变量的个数小于右边值的个数时,Lua程序会依次进行赋值,并弃掉右边多余的值。示例代码如下:


>> a,b,c,d = 1,2,3,4
> print(a,b,c,d)
1    2    3    4
> a,b,c,d,e = 1,2,3
> print(a,b,c,d,e)
1    2    3    nil    nil
> a,b,c = 1,2,3,4,5
> print(a,b,c)
1    2    3

3.4.2 控制语句

大多数编程语言中包含控制语句,Lua也不例外。下面详细介绍Lua语言中控制语句的使用方法,并给出一些示例,供读者参考。

1.条件判断语句

if语句由一个布尔表达式作为条件判断。当布尔表达式为true时,if语句中的代码块会被执行;当布尔表达式为false时,紧跟在if语句end之后的代码会被执行。示例参考代码清单3-6。

程序清单3-6 条件判断语句示例


> a = 100                --> 定义变量
> if(a == 10)            --> 检查布尔条件
>> then
>>   print("a的值为10")
>> elseif(a == 20)        --> 检查布尔条件
>> then
>>   print("a的值为20")
>> elseif(a == 30)        --> 检查布尔条件
>> then
>>   print("a的值为30")
>> else                --> 检查布尔条件
>>   print("没有匹配a的值")
>> end
没有匹配 a 的值
> print("a的真实值为: ", a)    --> 打印a的真实值
a 的真实值为:  100

2.for循环语句

for循环语句可以通过语句中的参数来重复执行指定语句。在Lua语言中,for循环分为两种,数值for循环与泛型for循环。

·数值for循环:通过一个数学运算符不断地运行for语句内部中的代码块。

·泛型for循环:通过一个迭代器函数来遍历所有值,类似Java中的foreach语句。

代码清单3-7显示了使用for循环语句打印0到30之间的素数。

程序清单3-7 for循环语句示例


> -- 打印0到30之间的素数及素数个数
> offVar = 0
> endVar = 30
> primevar = 0
> for number = offVar,endVar
>> do
>>   isPrime = true
>>   for i = 2,number-1 do
>>     if(number%i == 0)then
>>       isPrime =  false
>>     else
>>       end
>>     end
>>     if(isPrime)then
>>       primevar = primevar + 1
>>     print(number.."为素数")
>>   end
>> end
0为素数
1为素数
2为素数
3为素数
5为素数
7为素数
11为素数
13为素数
17为素数
19为素数
23为素数
29为素数
> print("素数总数为:"..primevar)
素数总数为:12

3.while语句

在Lua语言中,只要循环条件为真,while语句就会一直执行,直到循环条件为假。示例参考代码清单3-8。该示例使用while语句打印区间[0,10)内的数字。

程序清单3-8 while语句示例


> -- 打印区间[0,10)内的数字
> a=0
> while(a < 10)
>> do
>>   print("a的值为:", a)
>>   a = a+1
>> end
a 的值为:    0
a 的值为:    1
a 的值为:    2
a 的值为:    3
a 的值为:    4
a 的值为:    5
a 的值为:    6
a 的值为:    7
a 的值为:    8
a 的值为:    9

4.repeat语句

与for、while语句不同,repeat语句会在代码块执行结束后再进行条件判断。代码清单3-9相较于代码清单3-8会多打印数字10。

程序清单3-9 repeat语句示例


> -- 打印区间[0,10]内的数字
> a=0
> repeat
>>   print("a的值为:", a)
>>   a = a + 1
>> until(a > 10)
a的值为:    0
a的值为:    1
a的值为:    2
a的值为:    3
a的值为:    4
a的值为:    5
a的值为:    6
a的值为:    7
a的值为:    8
a的值为:    9
a的值为:    10

5.break & goto语句

break语句用来结束while、repeat或for循环。它将跳到循环外接着运行或者跳出最内层的循环。示例参考代码清单3-10。

程序清单3-10 break & goto语句


> -- 打印区间[0,5]内的数字
> a = 0
> while(a < 10) 
>> do
>>   print("a的值为:", a)
>>   a=a+1
>>   if(a > 5)
>>   then
>>     break  --> 使用 break 语句终止循环
>>   end
>> end
a的值为:    0
a的值为:    1
a的值为:    2
a的值为:    3
a的值为:    4
a的值为:    5

goto语句将程序的控制点转移到标签处。Lua中的标签也被认为是语句。Lua支持goto语句,但是有一定的局限性,具体如下。

1)不能从块外部跳到块内部。

2)不能跳出或者跳入一个函数。

3)不能跳入本地变量的作用域。

由于goto语句在实际中不常用,此处不做详细介绍。