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 语句有两大类:
- 数值 for 循环
- 泛型 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
其他运算符
..
连接两个字符串#
返回字符串或表的长度