学习 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 为假,返回 A
  • A 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 方法的返回值。

错误处理