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

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

系列文章目录

前言

🌲一、Lua变量

  • 变量在使用前,需要在代码中进行声明,即创建该变量。
  • 编译程序执行代码之前编译器需要知道如何给语句变量开辟存储区,用于存储变量的值。
  • Lua 变量有三种类型:全局变量、局部变量、表中的域。
  • Lua 中的变量全是全局变量,哪怕是语句块或是函数里,除非用local显式声明为局部变量。
  • 局部变量的作用域为从声明位置开始到所在语句块结束。
  • 变量的默认值均为nil。
    实例:
-- test.lua 文件脚本
a = 5               -- 全局变量
local b = 5         -- 局部变量

function joke()
    c = 5           -- 全局变量
    local d = 6     -- 局部变量
end

joke()
print(c,d)          --> 5 nil

do
    local a = 6     -- 局部变量
    b = 6           -- 对局部变量重新赋值
    print(a,b);     --> 6 6
end

print(a,b)      --> 5 6

function fun()
    a1=5
    b1=10
    c=a1+b1
    print(a,b1)
    print(c)
end
fun()

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

$ lua test.lua 
5    nil
6    6
5    6
5    10
15

注意:

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

b        --> nil
b = 10    
b        --> 10

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

b = nil
b        --> nil

🌳二、Lua赋值语句

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

t=2
print(t)
a="la"
print(a)

a="hello".."world"
t=t+1

print(t)
print(a)

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

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

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

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

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

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

实例:

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

a, b, c = 0, 1
print(a,b,c)             --> 0   1   nil
 
a, b = a+1, b+1, b+2     -- value of b+2 is ignored
print(a,b)               --> 1   2
 
a, b, c = 0
print(a,b,c)             --> 0   nil   nil

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

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

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

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

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

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

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

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

--Lua 对多个变量同时赋值,不会进行变量传递,仅做值传递:
a, b = 0, 1
a, b = a+1, a+1
print(a,b)               --> 1   1

a, b = 0, 1
a, b = b+1, b+1
print(a,b)               --> 2   2

a, b = 0, 1
a = a+1
b = a+1
print(a,b)               --> 1   2

🌴三、Lua索引

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

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

实例:

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

print(site.key)                    -->www.runoob.com

🌵四、Lua循环

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

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

🌲1.Lua while循环

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

1.语法

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

while(condition)
do
   statements
end

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

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

2.实例

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

a=10
while(a<20)
do
    print("a的值为:",a)
    a=a+1
end

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

a 的值为:    10
a 的值为:    11
a 的值为:    12
a 的值为:    13
a 的值为:    14
a 的值为:    15
a 的值为:    16
a 的值为:    17
a 的值为:    18
a 的值为:    19

🌳2.Lua for循环

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

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

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

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

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

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

2.实例

实例:

for i=1,f(x) do
    print(i)
end
 
for i=10,1,-1 do
    print(i)
end

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

验证如下:
实例:

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

以上实例输出结果为:

function
1
2
3
4
5
6
7
8
9
10

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

2.泛型for循环
1.语法

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

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

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

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

2.实例

循环数组 days:

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

以上实例输出结果为:

1	Sunday
Untitled-1.lua:135
2	Monday
Untitled-1.lua:135
3	Tuesday
Untitled-1.lua:135
4	Wednesday
Untitled-1.lua:135
5	Thursday
Untitled-1.lua:135
6	Friday
Untitled-1.lua:135
7	Saturday

🌴3.Lua repeat…until循环

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

1.语法

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

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

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

实例:

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

以上实例输出结果为:

a的值为:    10
a的值为:    11
a的值为:    12
a的值为:    13
a的值为:    14
a的值为:    15

🌵4.Lua循环嵌套

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

1.语法

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

for init,max/min value, increment
do
   for init,max/min value, increment
   do
      statements
   end
   statements
end

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

while(condition)
do
   while(condition)
   do
      statements
   end
   statements
end

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

repeat
   statements
   repeat
      statements
   until( condition )
until( condition )

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

2.实例

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

j =2
for i=2,10 do
   for j=2,(i/j) , 2 do
      if(not(i%j))
      then
         break
      end
      if(j > (i/j))then
         print("i 的值为:",i)
      end
   end
end

以上实例输出结果为:

i 的值为:    8
i 的值为:    9
i 的值为:    10

🌲五、Lua循环控制语句

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

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

🌲1.Lua break语句

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

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

break

流程图:

2.实例

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

--[ 定义变量 --]
a = 10

--[ while 循环 --]
while( a < 20 )
do
   print("a 的值为:", a)
   a=a+1
   if( a > 15)
   then
      --[ 使用 break 语句终止循环 --]
      break
   end
end

以上实例输出结果为:

a 的值为:    10
a 的值为:    11
a 的值为:    12
a 的值为:    13
a 的值为:    14
a 的值为:    15

🌳2.Lua goto语句

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

1.语法

语法格式如下所示:

goto Label

Label:

:: Label ::
2.实例

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

1.实例1
local a = 1
::label:: print("--- goto label ---")

a = a+1
if a < 3 then
    goto label   -- a 小于 3 的时候跳转到标签 label
end

以上实例输出结果为:

--- goto label ---
--- goto label ---

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

2.实例2

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

i = 0
::s1:: do
  print(i)
  i = i+1
end
if i>3 then
  os.exit()   -- i 大于 3 时退出
end
goto s1

以上实例输出结果为:

0
1
2
3
3.实例3

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

for i=1, 3 do
    if i <= 2 then
        print(i, "yes continue")
        goto continue
    end
    print(i, " no continue")
    ::continue::
    print([[i'm end]])
end

以上实例输出结果为:

🌳六、Lua无限循环

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

while(true)
do
    print("循环永远继续下去")
end

💬🌲🌳🌴🌵总结

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

相关文章