【Lua从青铜到王者基础篇】第三篇:Lua变量和循环

x33g5p2x  于2022-03-05 转载在 其他  
字(5.9k)|赞(0)|评价(0)|浏览(652)

系列文章目录

前言

🌲一、Lua变量

  • 变量在使用前,需要在代码中进行声明,即创建该变量。
  • 编译程序执行代码之前编译器需要知道如何给语句变量开辟存储区,用于存储变量的值。
  • Lua 变量有三种类型:全局变量、局部变量、表中的域。
  • Lua 中的变量全是全局变量,哪怕是语句块或是函数里,除非用local显式声明为局部变量。
  • 局部变量的作用域为从声明位置开始到所在语句块结束。
  • 变量的默认值均为nil。
    实例:
  1. -- test.lua 文件脚本
  2. a = 5 -- 全局变量
  3. local b = 5 -- 局部变量
  4. function joke()
  5. c = 5 -- 全局变量
  6. local d = 6 -- 局部变量
  7. end
  8. joke()
  9. print(c,d) --> 5 nil
  10. do
  11. local a = 6 -- 局部变量
  12. b = 6 -- 对局部变量重新赋值
  13. print(a,b); --> 6 6
  14. end
  15. print(a,b) --> 5 6
  16. function fun()
  17. a1=5
  18. b1=10
  19. c=a1+b1
  20. print(a,b1)
  21. print(c)
  22. end
  23. fun()

执行以上实例输出结果为:

  1. $ lua test.lua
  2. 5 nil
  3. 6 6
  4. 5 6
  5. 5 10
  6. 15

注意:

在Lua 语言中,全局变量无须声明即可使用,使用未经初始化的全局变量不会导致错误。当使用未经初始化的全局变量时,得到的结果为 nil:

  1. b --> nil
  2. b = 10
  3. b --> 10

当把nil赋值给全局变量时,Lua会回收该全局变量,例如:

  1. b = nil
  2. b --> nil

🌳二、Lua赋值语句

赋值是改变一个变量的值和改变表域的最基本的方法。

  1. t=2
  2. print(t)
  3. a="la"
  4. print(a)
  5. a="hello".."world"
  6. t=t+1
  7. print(t)
  8. print(a)

Lua 可以对多个变量同时赋值,变量列表和值列表的各个元素用逗号分开,赋值语句右边的值会依次赋给左边的变量:

  1. a, b = 10, 2*x <--> a=10; b=2*x

遇到赋值语句Lua会先计算右边所有的值然后再执行赋值操作,所以我们可以这样进行交换变量的值:

  1. --遇到赋值语句Lua会先计算右边所有的值然后再执行赋值操作,所以我们可以这样进行交换变量的值
  2. x, y = y, x -- swap 'x' for 'y'
  3. a[i], a[j] = a[j], a[i] -- swap 'a[i]' for 'a[j]'

当变量个数和值的个数不一致时,Lua会一直以变量个数为基础采取以下策略:

  1. 当变量个数和值的个数不一致时,Lua会一直以变量个数为基础采取以下策略:
  2. a. 变量个数 > 值的个数 按变量个数补足nil
  3. b. 变量个数 < 值的个数 多余的值会被忽略

实例:

  1. --[[当变量个数和值的个数不一致时,Lua会一直以变量个数为基础采取以下策略:
  2. a. 变量个数 > 值的个数 按变量个数补足nil
  3. b. 变量个数 < 值的个数 多余的值会被忽略--]]
  4. a, b, c = 0, 1
  5. print(a,b,c) --> 0 1 nil
  6. a, b = a+1, b+1, b+2 -- value of b+2 is ignored
  7. print(a,b) --> 1 2
  8. a, b, c = 0
  9. print(a,b,c) --> 0 nil nil

上面最后一个例子是一个常见的错误情况,注意:如果要对多个变量赋值必须依次对每个变量赋值:

  1. 上面最后一个例子是一个常见的错误情况,注意:如果要对多个变量赋值必须依次对每个变量赋值:
  2. a, b, c = 0, 0, 0
  3. print(a,b,c) --> 0 0 0

多值赋值经常用来交换变量,或将函数调用返回给变量:

  1. 多值赋值经常用来交换变量,或将函数调用返回给变量:
  2. a,b=f()

f()返回两个值,第一个赋给a,第二个赋给b。

应该尽可能的使用局部变量,有两个好处:

  • 避免命名冲突。
  • 访问局部变量的速度比全局变量更快。

注意:
Lua 对多个变量同时赋值,不会进行变量传递,仅做值传递:

  1. --Lua 对多个变量同时赋值,不会进行变量传递,仅做值传递:
  2. a, b = 0, 1
  3. a, b = a+1, a+1
  4. print(a,b) --> 1 1
  5. a, b = 0, 1
  6. a, b = b+1, b+1
  7. print(a,b) --> 2 2
  8. a, b = 0, 1
  9. a = a+1
  10. b = a+1
  11. print(a,b) --> 1 2

🌴三、Lua索引

对 table 的索引使用方括号 [];Lua 也提供了 . 操作。

  1. t[i]
  2. t.i -- 当索引为字符串类型时的一种简化写法
  3. gettable_event(t,i) -- 采用索引访问本质上是一个类似这样的函数调用

实例:

  1. site = {}
  2. site["key"] = "www.runoob.com"
  3. print(site["key"]) -->www.runoob.com
  4. print(site.key) -->www.runoob.com

🌵四、Lua循环

  • 很多情况下我们需要做一些有规律性的重复操作,因此在程序中就需要重复执行某些语句。
  • 一组被重复执行的语句称之为循环体,能否继续重复,决定循环的终止条件。
  • 循环结构是在一定条件下反复执行某段程序的流程结构,被反复执行的程序被称为循环体。
  • 循环语句是由循环体及循环的终止条件两部分组成的。

Lua 语言提供了以下几种循环处理方式:

🌲1.Lua while循环

Lua 编程语言中 while 循环语句在判断条件为 true 时会重复执行循环体语句。

1.语法

Lua 编程语言中 while 循环语法:

  1. while(condition)
  2. do
  3. statements
  4. end

statements(循环体语句) 可以是一条或多条语句,condition(条件) 可以是任意表达式,在 condition(条件) 为 true 时执行循环体语句。
流程图如下:

在以上流程图中我们可以看出在condition(条件)为 false 时会跳过当前循环并开始脚本执行紧接着的语句。

2.实例

以下实例循环输出 a 的值:
实例:

  1. a=10
  2. while(a<20)
  3. do
  4. print("a的值为:",a)
  5. a=a+1
  6. end

执行以上代码,输出结果如下:

  1. a 的值为: 10
  2. a 的值为: 11
  3. a 的值为: 12
  4. a 的值为: 13
  5. a 的值为: 14
  6. a 的值为: 15
  7. a 的值为: 16
  8. a 的值为: 17
  9. a 的值为: 18
  10. a 的值为: 19

🌳2.Lua for循环

Lua 编程语言中 for 循环语句可以重复执行指定语句,重复次数可在 for 语句中控制。

Lua 编程语言中 for语句有两大类::

  • 数值for循环
  • 泛型for循环
1.数值for循环

Lua 编程语言中数值 for 循环语法格式:

1.语法
  1. for var=exp1,exp2,exp3 do
  2. <执行体>
  3. end

var 从 exp1 变化到 exp2,每次变化以 exp3 为步长递增 var,并执行一次 “执行体”。exp3 是可选的,如果不指定,默认为1。

2.实例

实例:

  1. for i=1,f(x) do
  2. print(i)
  3. end
  4. for i=10,1,-1 do
  5. print(i)
  6. end

for的三个表达式在循环开始前一次性求值,以后不再进行求值。比如上面的f(x)只会在循环开始前执行一次,其结果用在后面的循环中。

验证如下:
实例:

  1. --#!/usr/local/bin/lua
  2. function f(x)
  3. print("function")
  4. return x*2
  5. end
  6. for i=1,f(5) do print(i)
  7. end

以上实例输出结果为:

  1. function
  2. 1
  3. 2
  4. 3
  5. 4
  6. 5
  7. 6
  8. 7
  9. 8
  10. 9
  11. 10

可以看到 函数f(x)只在循环开始前执行一次。

2.泛型for循环
1.语法

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

Lua 编程语言中泛型 for 循环语法格式:

  1. --打印数组a的所有值
  2. a = {"one", "two", "three"}
  3. for i, v in ipairs(a) do
  4. print(i, v)
  5. end

i是数组索引值,v是对应索引的数组元素值。ipairs是Lua提供的一个迭代器函数,用来迭代数组。

2.实例

循环数组 days:

  1. --#!/usr/local/bin/lua
  2. days = {"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"}
  3. for i,v in ipairs(days) do print(i,v) end

以上实例输出结果为:

  1. 1 Sunday
  2. Untitled-1.lua:135
  3. 2 Monday
  4. Untitled-1.lua:135
  5. 3 Tuesday
  6. Untitled-1.lua:135
  7. 4 Wednesday
  8. Untitled-1.lua:135
  9. 5 Thursday
  10. Untitled-1.lua:135
  11. 6 Friday
  12. Untitled-1.lua:135
  13. 7 Saturday

🌴3.Lua repeat…until循环

Lua 编程语言中 repeat…until 循环语句不同于 for 和 while循环,for 和 while 循环的条件语句在当前循环执行开始时判断,而 repeat…until 循环的条件语句在当前循环结束后判断。

1.语法

Lua 编程语言中 repeat…until 循环语法格式:

  1. repeat
  2. statements
  3. until( condition )
  • 我们注意到循环条件判断语句(condition)在循环体末尾部分,所以在条件进行判断前循环体都会执行一次。
  • 如果条件判断语句(condition)为 false,循环会重新开始执行,直到条件判断语句(condition)为 true 才会停止执行。

Lua repeat…until 循环流程图如下:

实例:

  1. --[ 变量定义 --]
  2. a = 10
  3. --[ 执行循环 --]
  4. repeat
  5. print("a的值为:", a)
  6. a = a + 1
  7. until( a > 15 )

以上实例输出结果为:

  1. a的值为: 10
  2. a的值为: 11
  3. a的值为: 12
  4. a的值为: 13
  5. a的值为: 14
  6. a的值为: 15

🌵4.Lua循环嵌套

Lua 编程语言中允许循环中嵌入循环。以下实例演示了 Lua 循环嵌套的应用。

1.语法

Lua 编程语言中 for 循环嵌套语法格式:

  1. for init,max/min value, increment
  2. do
  3. for init,max/min value, increment
  4. do
  5. statements
  6. end
  7. statements
  8. end

Lua 编程语言中 while 循环嵌套语法格式:

  1. while(condition)
  2. do
  3. while(condition)
  4. do
  5. statements
  6. end
  7. statements
  8. end

Lua 编程语言中 repeat…until 循环嵌套语法格式:

  1. repeat
  2. statements
  3. repeat
  4. statements
  5. until( condition )
  6. until( condition )

除了以上同类型循环嵌套外,我们还可以使用不同的循环类型来嵌套,如 for 循环体中嵌套 while 循环。

2.实例

以下实例使用了for循环嵌套:
实例:

  1. j =2
  2. for i=2,10 do
  3. for j=2,(i/j) , 2 do
  4. if(not(i%j))
  5. then
  6. break
  7. end
  8. if(j > (i/j))then
  9. print("i 的值为:",i)
  10. end
  11. end
  12. end

以上实例输出结果为:

  1. i 的值为: 8
  2. i 的值为: 9
  3. i 的值为: 10

🌲五、Lua循环控制语句

循环控制语句用于控制程序的流程, 以实现程序的各种结构方式。

Lua 支持以下循环控制语句:

🌲1.Lua break语句

  • Lua 编程语言 break 语句插入在循环体中,用于退出当前循环或语句,并开始脚本执行紧接着的语句。
  • 如果你使用循环嵌套,break语句将停止最内层循环的执行,并开始执行的外层的循环语句。
1.语法

Lua 编程语言中 break 语句语法格式:

  1. break

流程图:

2.实例

以下实例执行 while 循环,在变量 a 小于 20 时输出 a 的值,并在 a 大于 15 时终止执行循环:

  1. --[ 定义变量 --]
  2. a = 10
  3. --[ while 循环 --]
  4. while( a < 20 )
  5. do
  6. print("a 的值为:", a)
  7. a=a+1
  8. if( a > 15)
  9. then
  10. --[ 使用 break 语句终止循环 --]
  11. break
  12. end
  13. end

以上实例输出结果为:

  1. a 的值为: 10
  2. a 的值为: 11
  3. a 的值为: 12
  4. a 的值为: 13
  5. a 的值为: 14
  6. a 的值为: 15

🌳2.Lua goto语句

Lua 语言中的 goto 语句允许将控制流程无条件地转到被标记的语句处。

1.语法

语法格式如下所示:

  1. goto Label

Label:

  1. :: Label ::
2.实例

以下实例在判断语句中使用 goto:

1.实例1
  1. local a = 1
  2. ::label:: print("--- goto label ---")
  3. a = a+1
  4. if a < 3 then
  5. goto label -- a 小于 3 的时候跳转到标签 label
  6. end

以上实例输出结果为:

  1. --- goto label ---
  2. --- goto label ---

从输出结果可以看出,多输出了一次 — goto label —。

2.实例2

以下实例演示了可以在 lable 中设置多个语句:

  1. i = 0
  2. ::s1:: do
  3. print(i)
  4. i = i+1
  5. end
  6. if i>3 then
  7. os.exit() -- i 大于 3 时退出
  8. end
  9. goto s1

以上实例输出结果为:

  1. 0
  2. 1
  3. 2
  4. 3
3.实例3

有了 goto,我们可以实现 continue 的功能:

  1. for i=1, 3 do
  2. if i <= 2 then
  3. print(i, "yes continue")
  4. goto continue
  5. end
  6. print(i, " no continue")
  7. ::continue::
  8. print([[i'm end]])
  9. end

以上实例输出结果为:

🌳六、Lua无限循环

在循环体中如果条件永远为 true 循环语句就会永远执行下去,以下以 while 循环为例:
实例:

  1. while(true)
  2. do
  3. print("循环永远继续下去")
  4. end

💬🌲🌳🌴🌵总结

以上就是今天要讲的内容,本文介绍了Lua语言变量和Lua循环以及Lua流程控制,学会这些对于以后的操作会变得非常的便捷,所以我们务必掌握。另外如果上述有任何问题,请懂哥指教,不过没关系,主要是自己能坚持,更希望有一起学习的同学可以帮我指正,但是如果可以请温柔一点跟我讲,爱与和平是永远的主题,爱各位了。

相关文章