lua基础简介
Posted 飞鹰技术
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了lua基础简介相关的知识,希望对你有一定的参考价值。
lua是一个简单的方便易用的脚本语言。
变量
lua是区分大小写,全局变量不需要创建(赋值即创建),访问未初始化的变量不会引起错误(值为nil);删除全局变量,只需将其赋值为nil即可;
以一个下划线开始,跟着一个或多个大写字母的标识符为保留的特殊标识符;
lua中下划线(_)为哑变量,可方便处理忽略部分函数返回值(多个返回值,只需其中一部分)如:
local _, j = string.find("123456", "23) --只关心结束,不关心起始
通过local创建的变量为局部变量
全局变量arg保存有脚本的启动参数:脚本名称位于索引0处,参数依次位于索引1、2...处;脚本前的选项则为负索引;
lua -e "sin=math.sin" test.lua a b
arg[-3]="lua"
arg[-2]="-e"
arg[-1]="sin=math.sin"
arg[0]="test.lua"
arg[1]="a"
arg[2]="b"
注释
lua使用--注释一行,块注释使用"--[["开始,"]]"结束
基础类型
lua中有nil, boolean, number, string, userdata, function, thread, table,八种基础类型;
函数type可根据参数的值返回对应的类型名称
a = 8; print(type(a))
boolean类型
取值(false,true);lua中将nil与false视为‘假’,其他值(包括数字0,与空字符串)都视为‘真’
10=="10":返回false(类型不同)
字符串类型
string 是不可变的值,使用一对单引号或双引号界定;
可使用一对匹配的方括号([[ ... ]],[==[ ... ]==]等,类似块注释),这种形式可跨行,同时不处理里面的转义序列;
字符串前放置#,获得字符串的长度(如,#str);
字符串使用两个点(..)进行连接(连接时,数字会自动转换为字符处理)
lua提供数字与字符串的自动转换,在字符串上应用算数操作时,会尝试转换成一个数字;
tonumber:字符串转数字
tostring:数字转字符串
table类型
table 关联数组,可通过除nil外的类型值做索引;没有固定大小,可动态添加任意数量的元素到一个table中;
a = {} 创建一个空table
days={"Sun", "Mon" ...}:则days[1]="Sun", days[2]="Mon";
w={x=0, y=1}:w.x或w["x"]的值为0
opnames={["+"]="add", ["-"]="sub"}:操作符与负数只能通过此方式初始化
a[“x”]=y; a.x=y是等价的;
删除一个条目
设置为nil即可a.x=nil (a["x"]=nil):无论x是否存在,都可以
table.remove(a, k):若k不存在,则会出错
数组通常以1作为索引的起始值;#a获取其长度(从1到第一个值为nil的索引位置),若数组有空隙(即删除过中间元素)则长度不准,可通过table.maxn来返回最大的正索引数;
在尾部添加值a[#a+1]=v
删除最后一个值a[#a]=nil
操作符
操作符优先级见下图
数字和字符串之外的其他类型只能进行相等于不等比较;字符串与数字进行大小比较时会导致错误(禁止);
不等为‘~=’:两个值具有不同的类型,则认为他们不相等;table、userdata、function只有引用同一个对象时(不同对象时,即使对象内容相同也不等)才会相等。
逻辑操作符and、or、not;前两个使用‘短路求值’,and优先级高于or;
and:若第一个操作数为假,则返回第一个操作数;否则返回第二个操作数;
or:若第一个操作数为真,则返回第一个操作数;否则返回第二个操作数;
x= x or v:等价于if not x then x=v end(x没有设置时,设置为v)
max = (x>y) and x or y:等价于C语言中的 (x>y)?x:y;
语句
lua中常规语句与C与Pascal中的类似。
赋值
lua中使用=进行赋值,除简单赋值外还能进行多重赋值。
多重赋值:先对等号右边所有元素求值,然后才赋值;lua总是将右边值的个数调整到与左边变量的个数相同,若值少于变量数,多余变量赋为nil;若值多余变量个数,则被丢弃掉。
x, y = y, x --交换x与y
if语句
if语句后必须跟then,最后以end结束
if [Condition] then
...
[elseif]
...
[else]
...
end
while语句
while [Condition] do
...
end
repeat语句
repeat
...
until [Condition]
for语句
1、数字型for
for var=begin,end,step do
...
end
[step]可省略(默认为1);三个表达式是在循环开始时一次性求值(以后不再进行求值)。
2、泛型for
通过一个迭代器(iterator)函数遍历所有的值;当第一个返回值为nil时,循环终止
for <var-list> in <exp-list> do -- list都是以逗号分隔
...
end
for先对in后面的表达式求值,并保存三个值:迭代器函数、恒定状态和控制变量的初值(多余丢弃,不足使用nil)
ipairs类似如下:
local function iter(a, i) ... return i+1,v end
function ipairs(a) return iter, a, 0 end
for就是依次调用iter(a,0), iter(a,1) ...
ipairs(i,v in ipairs(a))是Lua提供的一个用于数组的迭代器函数;[i]为索引值(从1开始,所以不要定义不是从1开始的数组),[v]为对应位置的数字值;
其他迭代函数:
io.lines:文件中的每一行
pairs:table元素
string.gmatch:字符串中单词
语句块
do ... end
定义一个语句块,基本等同于C++中{...}
函数
[local] function FunName(param1, ...);返回值由return决定,return语句后面的内容不要使用圆括号(使用圆括号会改变语义);
table.unpack():用于返回数组中所有元素
function foo0() return end // 无输出
function foo3() return 1,2,3 end // 1,2,3
function enclosure0 return (foo0()) end // nil
function enclosure3 return (foo3()) end // 1
变长参数(...)
所有参数被收集到变长参数中(...);固定参数必须在变长参数前
function VarTest(...)
for i=1, select("#", ...) do -- #为获取变参长度
ag=select(i, ...) -- 获取第n个数
print(ag)
end
end
尾调用消除(tail-call elimination):当函数最后一个动作是return另外一个函数(只能是直接返回函数,不能有任何特殊处理,包括加圆括号)时,不会耗费任何栈空间(相当于goto)
编译
loadfile:从文件中加载代码,并编译后将结果作为函数返回(调用返回函数即执行代码);
dofile:相当于调用loadfile后,执行返回的函数
load:与loadfile类似,只是从字符串中加载代码(代码直接加载到全局作用域:若定义了同名的全局与局部变量,则使用的是全局变量)
require:加载文件(类似其他语言的引用库,由lua从自己搜索加载目录的路径),若加载过则不会再次加载
i=32
local i=0
g=load("i=i+1; print(i)")
f=function () i=i+1; print(i) end
g() -->33 使用的全局变量
f() -->1 使用的local变量
错误error
Lua遇到任何未预期条件会引发错误(结束当前程序块并返回应用程序)
有两个函数处理错误:
assert:assert(expression, message)
error:error(message[, level]),level指示获取错误的位置并添加到message头部
1(默认):调用error位置(文件+行号)
2:调用error的函数
0:不添加位置信息
pcall(protect call)包装执行的代码,根据包装的代码执行结果返回不同值:
pcall(fun[, arg1, ...])
无错误:返回true
有错误:返回false,errorinfo
xpcall(fun, errHandle[, arg1, ...]):errHandle用于出错处理
debug库中提供了两个通用的错误处理函数:
debug.debug:提供Lua提示符,让用户检查错误原因
debug.traceback:根据调用栈构建一个扩展的错误消息
以上是关于lua基础简介的主要内容,如果未能解决你的问题,请参考以下文章