lua 学习笔记

lua 也是一门强大的语言,现将学习笔记简要记录如下:

变量

lua 中的变量默认总是全局的,除非用 local 声明它。变量没有类型,值才有类型。一个变量在未使用时它的值为 nil,同理可将一个已经使用完毕的变量赋值为 nil,就删除了这个变量。

类型

lua 中总共有 8 种类型,如下:

类型 描述
nil 该类型的值只有一个,即nil
boolean 布尔类型,有true和false两种值
number 数字类型,所有整形和实数都用number表示
string 字符串
function 函数类型,和 C 不同,lua中函数也是一种类型,意味着可以将函数赋值给变量
userdata 用户自定义类型,对等于 C 中struct
thread 线程类型
table 表,也正是 lua 的强大之处,集成了map,数组等数据结构

循环

lua 支持 3 种循环方式:

while
while(condition)
do
    --something;
end
for
for var=exp1,exp2,exp3 do
   --something
end

表示变量 var 从 exp1 变化到 exp2,每次步距为 exp3。如果不写 exp3,默认为 1。和 C 不一样的是,这三个表达式只在循环开始前求值一次,之后不再计算。

for 的另一种写法为(设 a 为一个数组):

for index,val in ipairs(a) do
   print(val)
end

这是 for 循环的泛型写法,作用是打印数组的所有值。类似于 C 中的 do...while 循环,写法上也一致:

repeat
   --something
until(condition)

条件语句

条件判断语句如下:

if (condition)
then
    --something
elif
then
    --other
else
    --lastthing
end

上面说过了,在 lua 中,只有 falsenil 被认定为假,其他的均为真。重说三!

函数

lua 中函数的写法如下:

f = function (arg1,arg2...)
   --something
end

不过这种写法不符合我们的习惯,所以 lua 提供了语法糖的函数形式:

function f(arg1,arg2...)
    --something
end

说明几点:

运算符

数组

在 lua 中,数组是用表来表示的,可以用 [] 来索引数组元素,如下:

array={"one","two","three","four"}
for index =1,4,1 do
    print (array[index])
end

如你所见,数组的默认下标是从 1 开始的,不过我们可以修改。

表是 lua 提供的功能强大的数据结构,可以用来存储任何 key-value 值对。 t={} 即可创建一个空表,t["first"]=1 即可向里面添加元素。 此外,lua 库里面有许多表操作函数,在此不写了,感兴趣的读者可以搜索相关资料。

模块与包

lua 中的模块是由变量、函数等已知元素组成的 table,因此创建一个模块很简单,就是创建一个 table,然后把最要导出的函数、常量放入其中,最后返回这个 table 就行了。对我来说,从思维上认识到这一点的转变很重要。举个例子:

module={}
module.const1="hello world"
function module.fun()
    return "hello world"
end
return module

使用 require 函数来加载一个模块:require ("模块名") 或者 require "模块名"

元表,暂时没写

协程

全称协同程序,与线程类似,都拥有独立的堆栈,指令指针和共享全局变量等。但协程是在用户态实现的,而线程是由操作系统在系统态实现的,也就是说在多核 CPU 上多个线程可以并行执行,而协程只能是并发的(请自行查找并发和并行的区别)。可以说协程就是加上了同步锁的线程。 用法:

方法 描述
coroutine.create() 创建一个协程并返回它,参数是一个函数
coroutine.resume() 重启 coroutine
coroutine.yield() 挂起 coroutine
coroutine。status() 查看 coroutine 的状态,有三种状态:dead,sudpend,running
coroutine.wrap() 返回一个 coroutine 函数,当调用该函数时就直接进入 coroutine
coroutine.running() 返回当前正在运行的 coroutine 的线程 id

文件操作

以下是打开文件和关闭文件的操作:

file = io.open(filename,mode)
io.close(file)

lua 的文件操作分两种:简单模式和完全模式 简单模式:当程序中只打开一个文件时,使用简单模式更方便,打开文件后,设置默认输入输出文件,然后直接调用库函数就 OK,比如:

io.input("test.txt") --设置默认输入文件为test.txt
print(io.read())  --打印文件第一行

完全模式:可以打开多个文件,使用文件句柄来访问即可:

file=io.open("test.txt",a)
file:write("hello world")
file:close()