Table of Contents

Lua

在游戏行业很常用的语言,小巧轻便

关于Lua:

  1. Lua是一门语言,解释型语言,所以提供一个解释器,是可执行程序
  2. Lua提供了源码,源码可以编译出解释器
  3. Lua提供一些接口,方便与其他语言协作,在工程中加入Lua的源码就能使用Lua提供的接口
  4. Lua还可以作为库提供接口,把源码中的main删掉,就可以编译为DLL和Lib,配合头文件就可以作为库使用

专题内容

基础语法

--Lua是一种解释型语言、轻量快速、和C/C++兼容很好
--Lua的解释器体积很小,依赖也很少,没有环境等问题
--Lua很方便嵌入其他程序或作为脚本使用
--Lua的代码语句后面不加分号
--Lua代码文件的后缀是.lua
 
--这是注释
 
--[[
这是
多行注释
--]]
 
--Lua没有面向对象的特性
--Lua支持面向过程编程和函数式编程
--Lua没有程序入口函数的概念,就是从头开始执行的脚本
 
--Lua是弱类型的语言,一个变量没有固定类型的说法
--Lua的数据类型包括
--无效变量nil
 
--逻辑类型boolean,包含true和false
 
--双精度浮点数number,Lua中只有这一种数字
--所以C语言中浮点数不准确、不能判等的问题应该就不存在了
--浮点数是准确的(?这里先存疑)
someNumber=10
someNumber=3.14
 
--字符串string,字符串由单引号或双引号包括起来
shortString='Hello'
shortString="Hello"
--长字符块应该使用双方括号包括起来
longText=
[[
    Hello
    World
    Again
]]
--字符串和数字进行运算的时候会自动尝试转换为数字
print("1"+1)
--使用#得到字符串的长度
print(#shortString)
--字符串连接应该使用两个点,其他类型连接时会尝试进行转换
print('A'..'B'..1+1)
 
--函数function,可以是Lua或C的函数
--Lua支持函数式编程,函数是第一公民,可以作为变量传递
 
--数据结构userdata,任意存储在变量中的C数据结构
 
--线程thread,一个执行的独立路线
 
--表table,使用{}构建一个空表
someTable={}
someTable[1]='1'
someTable['2']=2
 
--创建时初始化,大括号中是Value,Key是从1开始的数字
--这样就是C语言中的数组了
--以下初始化相当于
--someTable[1]="Value_1"
--someTable[2]="Value_2"
--someTable[3]="Value_3"
someTable={"Value_1","Value_2","Value_3"}
 
--对于字符串类型的Key,符合命名规范就可以使用点进行索引
someTable['someKey']=42
print(someTable.someKey)
 
--默认情况下,变量都是全局的,即使是在代码块中
--创建局部变量应该显式使用local标识符
--局部变量的生命周期到代码块结束为止
while flase do
    local localData=3.14
end
 
--访问一个变量之前不需要声明,甚至不需要给它赋值
--如果是访问的变量是空变量则返回nil,注意是以字符串的形式
--删除变量的做法就是将其赋值为nil,和C++中的共享指针类似
--nil在Lua中就是表示无效变量,一个变量存在当且仅当其不等于nil
 
--打印一个内容:print
print(someData)
--获取某个变量目前的类型:type
type(someData)
 
--变量赋值可以使用多个变量同时赋值
--当左边变量更少时,右边后面多余的值就会被忽略
--当右边变量更少时,右边后面不足的位置使用nil填充
--右边的变量在赋值开始之前会计算好结果,所以没有先后顺序的影响
x,y,z=1,2
 
--但是注意,以下的这种写法是不对的
local x,y=1,2
print(x..' '..y)
 
--定义函数
--函数无需显式写明返回值信息,可以返回多个返回值
function someFunction(x,y)
    return x+y,x-y
end
 
--这里写的是否正确?匿名函数是指这个吗?检查一下
--定义匿名函数
someFunction=function(x,y)
 
    --定义一个局部的函数,和变量类似,生命周期有限
    local function localFunction() end
    anotherFunction=localFunction
    print('anotherFunction',type(anotherFunction))
 
    return x-y
end
 
someFunction(1,0)
--本地函数的生命周期已经结束,无法在外部访问
print('localFunction',type(localFunction))
 
--Lua的循环支持break,但是不支持continue
--仔细想一想,continue确实不是必需的
 
--可以使用goto语句进行流程控制
goto SkipPrint
print('Will Skip Print')
::SkipPrint::
 
--while循环
Index=1
while(Index<=10)
do
    Index=Index+1
end
 
--区间for循环
--3个参数的意思分别是起始值、终止值、步进值
--步进值是可选的,默认为1
--循环范围是闭区间
for Index=1,3,1 do end
 
--泛型for循环
--ipairs是一个内置函数,用来生成一个迭代器
someTable={"First","Second","Third"}
for i,j in ipairs(someTable) do
    print(i..'='..j)
end
 
--repeat循环
--until后面描述终止条件
Index=1
repeat
    Index=Index+1
until(Index>=3)
 
--逻辑分支
if(x=="nil") then
    print('x NO')
elseif(x==1) then
    print('x ONE')
else
    print('x YES')
end
 
--运算符
--数值运算:加减乘除(+)(-)(*)(/),取余(%),乘幂(^)
--关系运算:等于(==),不等(~=),大小判断(>)(>=)(<)(<=)
--逻辑运算:与或非(and)、(or)、(not)

零散

function check(x)
    if x then print('Yes') else print('No') end
end
 
-- 逻辑为假的情况
check(false) -- 这当然是No
-- 下面3个本质上参数都是nil
check(nothing)
check(nil)
check()
 
-- 逻辑为真的情况
check(true) -- 这当然是Yes
check(1)
check(0) -- 注意:这个是Yes
check({}) -- 这个也是Yes
check(#{}) -- 和0同理

Odt笔记(20221007)