LUA常用函数记录----随便写写,写给自己看
pcall()
-
原型:pcall(f, arg1, ···)
-
解释:在一个保护模式下调用参数
f
指定的函数。这意味着在函数f
中发生的错误都不会被抛出,相反,函数pcall
会捕获发生的错误然后返回一个错误状态,函数的第一个返回值是一个表示错误状态的布尔变量,当被调用函数被成功调用并且没有错误时,函数返回true
作为第一个返回值,并且依次返回被调用函数的所有返回值,当发生错误时,函数会返回一个false
并且紧跟着错误信息。--调用方法t.updTestInfo,发生错误不会抛出异常,返回错误状态 --不是a的时候,重新赋值"03"给initTab.trans_status local a,b,c =pcall(t.updTestInfo,initTab) if not a then initTab.trans_status = "03"; logerror(c,b); error(NVL("9999"),"修改信息失败")
-- 打印一下苦逼的程序猿时间 print("\nnow time is "..os.date()) local function add_num(num1, num2) return num1 + num2; end -- 打印函数正常调用 print("\ntest function add_num reault:") print(pcall(add_num, 3, 5)) -- 打印可能出现问题的函数 print("\ntest function add_num reault:") print(pcall(add_num, 3, "what"))
-
从结果可以看出函数第一个返回值就是一个表示函数执行状态的布尔值。
-
由函数两次运行可以看出,不管被调用函数是否发生错误,函数都不会中断。
-
这个函数可以为被执行函数提供一个保护模式,保证程序不会意外终止。
repeat() -- until
-
先执行循环体,然后判断until 之后的条件dbop:next()~=1(下一条数据不等于1,输出为true)
-- if条件之后ret<0时,输出为true;表示dbop:select查询的数据为0,表示这个表中无数据
local ret = dbop:select(sSql,paramTab);
if ret < 0 then
logdebug("查询大额邮箱失败");
end
--ret>0表示,输出为true,进入循环体repeat...until
--repeat...until中先执行循环体,然后判断until 之后的条件dbop:next()~=1(下一条数据不等于1,输出为true)
--
if ret > 0 then
repeat
local rowTab= dbop:row2table();
table.insert(resList,rowTab);
until dbop:next()~=1
end;
--if条件之后iRet<0时,输出为true,返回error
if iRet < 0 then
error("未查到测试信息");
end
repeat
local tempTab=dbop:row2table();
table.insert(t.p.cycle,tempTab);
t.p.NUM=t.p.NUM+1;
until dbop:next()~=1
t.p.num_local=tostring(tonumber(t.v.num_local)+t.p.NUM-1);
end
--dofile() loadfile() require()的区别
--dofile()和loadfile()都不做所搜,require根据package.path来做搜索
--dofile()编译文件并做执行,重复调用dofile()会重复编译和执行
--loadfile()只是编译返回而不做执行,重复调用就重复编译
--require()是搜索到文件并编译和执行,重复调用不会重复执行
--require返回值的问题:默认返回true,如果require的lua文件有return,则以其return的值作为require的返回值
迭代器for遍历table时,ipairs和pairs的区别:
区别一:ipairs遇到nil会停止,pairs会输出nil值然后继续下去
区别二:
--pairs会输出table中的键和键值对,先顺序输出值,再乱序(键的哈希值)输出键值对。
local a = {"Hello", "World", a = 1, b = 2, x = 10, y = 20, "Good", nil, "Bye"}
for k,v in pairs(a) do
print(k,v)
end
--****************************
--输出结果:
--1 Hello
--2 World
--3 Good
--5 Bye
--y 20
--x 10
--a 1
--b 2
--****************************
--ipairs并不会输出table中存储的键值对,会跳过键值对,然后顺序输出table中的值,遇到nil则会停止。
local a = {"Hello", "World", a = 1, b = 2, x = 10, y = 20, "Good", nil, "Bye"}
for i,v in ipairs(a) do
print(v)
end
--输出结果
--Hello
--World
--Good
可见:ipairs并不会输出table中存储的键值对,会跳过键值对,然后顺序输出table中的值,遇到nil则会停止。
而pairs会输出table中的键和键值对,先顺序输出值,再乱序(键的哈希值)输出键值对。
这是因为,table在存储值的时候是按照顺序的,但是在存储键值对的时候是按照键的哈希值存储的,并不会按照键的字母顺序或是数字顺序存储。
=》对于a来说,如果执行print(a[3]),输出的结果也会是Good。也就是说table并不会给键值对一个索引值。也就是说,ipairs知识按照索引值顺序,打印出了table中有索引的数据,没有索引值的不管。而pairs是先按照索引值打印,打印完成后再按照键值对的键的哈希值打印它的值。
总结:
①ipairs只能遍历key为整数的值,且遇到nil就退出
②pairs 会全部输出