首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

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=: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 in 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:根据调用栈构建一个扩展的错误消息

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180620G1SWT100?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券