[Lua学习] Lua学习笔记

Lua 学习笔记

Lua 变量

Lua 变量有三种类型:全局变量、局部变量、表中的域

Lua 中的变量全是全局变量,哪怕是语句块或是函数里,除非用 local 显式声明为局部变量

局部变量的作用域从声明位置开始到所在语句块结束

变量默认值均为 nil

赋值语句

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

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

Lua 可以对多个变量同时赋值

a, b = 10, 20
x, y = y, x -- swap x for y

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

  • 变量个数 > 值的个数:按变量个数补足 nil
  • 变量个数 < 值的个数:多余的值会被忽略

索引

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

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

Lua 循环

While 循环

在条件为 true 时,让程序重复地执行某些语句。执行语句前会检查条件是否为 true

while(condition)
do
   statements
end

for 循环

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

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

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

数值 for 循环

for var = exp1, exp2, exp3 do
    -- <执行体>
end

var 从 exp1 变化到 exp2,每次变化以 exp3 为步长递增 var,并执行一次“执行体”。

exp3 是可选的,如果不指定,默认为 1。

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

for 的三个表达式在循环开始前一次性求值,以后不再进行求值。

function f(x)  
    print("function")  
    return x*2  
end  
for i=1,f(2) do print(i)  
end

上面的代码输出为

function
1
2
3
4

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

泛型 for 循环

泛型 for 循环通过一个迭代器函数来遍历所有值。

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

i 是数组索引值,v 是对应索引的数组元素值。

ipairs 是 Lua 提供的一个迭代器函数,用来迭代数组

repeat...until 循环

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

repeat
   statements
until( condition )

如果条件判断语句 contidion 为 false,循环会重新开始执行,直到条件判断语句为 true 才会停止执行

循环控制语句

break 语句

用于退出当前循环或语句

goto 语句

将控制流程无条件地转到被标记的语句处

语法格式:

goto label

label 的格式为:

::label::

例:

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

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

有了 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

控制流程

if 语句

if(布尔表达式)
then
   --[ 在布尔表达式为 true 时执行的语句 --]
end

要注意的是 Lua 中 0 为 true。

if...elseif...else 语句

if( 布尔表达式 1)
then
   --[ 在布尔表达式 1 为 true 时执行该语句块 --]

elseif( 布尔表达式 2)
then
   --[ 在布尔表达式 2 为 true 时执行该语句块 --]

elseif( 布尔表达式 3)
then
   --[ 在布尔表达式 3 为 true 时执行该语句块 --]
else 
   --[ 如果以上布尔表达式都不为 true 则执行该语句块 --]
end

函数

函数定义

optional_function_scope function function_name( argument1, argument2, argument3..., argumentn)
    function_body
    return reslt_params_comma_separated
end
  • optional_function_scope: 函数作用范围,全局/局部
  • function_name: 函数名称
  • argument1, argument2, argument3..., argumentn: 函数参数
  • function_body: 函数体
  • reslt_params_comma_separated: 返回值,可以返回多个值,每个值以逗号隔开

实例

function max(num1, num2)

   if (num1 > num2) then
      result = num1;
   else
      result = num2;
   end

   return result;
end

Lua 中函数也可作为参数传递给参数

可变参数

在函数参数列表中使用三点 ... 表示函数有可变的参数。

function add(...)  
local s = 0  
  for i, v in ipairs{...} do   --> {...} 表示一个由所有变长参数构成的数组  
    s = s + v  
  end  
  return s  
end  
print(add(3,4,5,6,7))  --->25

可以将可变参数赋值给一个变量

例如计算几个数的平均值

function average(...)
   result = 0
   local arg={...}    --> arg 为一个表,局部变量
   for i,v in ipairs(arg) do
      result = result + v
   end
   print("总共传入 " .. #arg .. " 个数")
   return result/#arg
end

print("平均值为",average(10,5,3,4,5,6))

可以通过 `select("#", ...) 获取可变参数的数量

function average(...)
   result = 0
   local arg={...}
   for i,v in ipairs(arg) do
      result = result + v
   end
   print("总共传入 " .. select('#',...) .. " 个数")
   return result/select("#",...)
end

print("平均值为",average(10,5,3,4,5,6))

有时候我们可能需要几个固定参数加上可变参数,固定参数必须放在可变长参数之前

  • select('#', ...) 返回可变参数的长度
  • select(n, ...) 返回从起点 n 开始到结束位置的所有参数列表

运算符

Lua 提供集中运算符类型

  • 算数运算符
  • 关系运算符
  • 逻辑运算符
  • 其他运算符

算数运算符

  • + - * / 加减乘除
  • % 取余
  • ^

关系运算符

  • == 等于
  • ~= 不等于
  • > 大于,< 小于
  • >= 大于等于,<= 小于等于

逻辑运算符

  • and
  • or
  • not

其他运算符

  • .. 连接两个字符串
  • # 返回字符串或表的长度
posted @ 2022-01-16 20:09  沐灵_hh  阅读(146)  评论(0编辑  收藏  举报