Lua知识回顾
学习 Lua 编程语言的比较
无聊之余,想要找个东西来打发时间和排解心中的百无聊赖,于是乎,想要重新玩一下 corona 这个游戏开发引擎。当然,第一步就是重温下以前学过的 lua 编程语言,这次我打算在 Windows 操作系统上摆弄下这玩意。
首先进入lua 官网找到二进制文件的下载地址,下载好了之后,解压后先把文件夹里的luax.ext
(x 代表版本号)文件修改为lua.exe
,然后将该目录添加到 Path 系统变量中,在终端输入lua -v
检查是否配置完成。
注意点
- 调用函数时,被调用的函数一定要在调用者之前定义
变量
变量的作用域:
- 全局变量:除非显式声明为 local,其它所有变量都是全局变量;
- 本地变量:使用 local 来声明变量
- 表(table)变量:特殊类型的变量,值不可以为 nil
容易混淆的例子:
local a, b = 1, 2 --该写法正确
local a = 1, b = 2 --该写法错误
数据类型
Lua 是动态类型语言,变量没有类型,只有值有类型,下面是数据类型:
- nil
- boolean
- number
- string
- function
- userData
- thread
- table
type
函数用来计算变量的数据类型。所有的变量除非赋值,不然都是指向nil
。
操作符
A^n
表示 A 的 n 次方~=
表示不等于的操作符A and B
:A 为真,返回 B;A 为假,返回 AA or B
:A 为真,返回 A;A 为假,返回 B!A
:A 为真,返回假;A 为假,返回真..
:连接字符串#
:返回字符串或表的长度
循环
while 循环:
local i = 20
while(i > 0)
do
print(i)
i = i - 1
end
for 循环:
for i = 10, 1, -1
do
print(i)
end
-- for 初始值,最大/小值,步长
repeat…until 循环
local a = 10
repeat
print(a)
a = a - 1
until(a < 1)
条件控制语句
条件为 false 的情况只有值为 false 或 nil 时成立,0 被认为是 true。
if nil then
print(" nil is true")
else
print("nil is false")
end
函数
在 Lua 中,可以将函数赋值给变量,也可以将函数作为其它函数的参数传递。
使用...
作为参数可以创建参数数量可变的函数:
function average(...)
result = 0
local arg = {...}
for i, v in ipairs(arg) do
result = result + v
end
return result / #arg
end
字符串
字符串创建的方法:
''
:单引号" "
:双引号[[ ]]
字符串方法的调用形式:string.methodName(params)
数组
数组是用索引为数字的表来实现的,索引从 1 开始,如果索引不存在,则返回 nil。
arr = {"A", "B", "C"}
for i = 0, 3 do
print(arr[i])
end
– nil A B C
迭代器
迭代器(Iterator)可以遍历集合或容器中的元素,而在 Lua 中,集合一般指的是表。
arr = {"A", "B"}
for key, value in ipairs(arr)
do
print(key, " = ", value)
end
在 Lua 中,使用函数来实现迭代器,有两种类型的迭代器:
- 无状态
- 有状态
表
表使用{}
来表示
模块
模块可以使用 require 来加载,模块由一系列函数和变量组成,所有这些函数和变量包含在表中。
模块名和文件名要相同。
-- mymath.lua定义了模块
local mymath = {}
function mymath.add(a, b)
print(a + b)
end
return mymath
– app.lua
mymathmodule = require("mymyth")
mymathmodule.add(1, 2)
元表
附着在表上的元表(metatable)会修改表的行为。
setmetatable(table, metatable)
:设置表的元表getmetatable(table)
:获取表的元表
协程
coroutine.create(f)
:创建新的协程coroutine.resume(co [, val1, ...])
:继续执行协程,可以传递参数。该调用会返回操作的状态,和一些可选的返回值coroutine.yield(...)
:停止协程的执行,传递给该方法的参数会作为 resume 方法的返回值。