Lua学习随笔
变量
local a = 1 局部变量
b = 2 默认全局变量
多重赋值
a,b=1,2
print(a,b)
lua支持16进制还有科学计数法
a=0x11
b=2e10
print(a,b)
17 20000000000.0
print(1<<3) 左移三位 1000=8
print(10^2) 100
Sting类型 支持'',"" 也支持转义字符\n 换行
a="li\nsi"
b='zhangsan'
print(a,b)
li
si zhangsan
for循环
- ipairs迭代器
days = {"one","two",a=1,b=2,"three",z=3,"king"}
for i,v in ipairs(days) do
print(v)
end
输出:
one two three king
说明:ipairs按照索引值顺序,打印出了table中有索引值的数据,没有索引值的不管。
- pairs迭代器
days = {"one","two",a=1,b=2,"three",z=3,"king"}
for i,v in pairs(days) do
print(v)
end
输出:
one two three king 1 3 2
- days = {"one","two",a=1,b=2,"three",z=3,"king"}
for i,v in pairs(days) do
print(days[3])
end
输出:
three three three three three three three three
说明:pairs是先按照索引值打印,打印完成后再按照键值对的键的哈希值打印它的值,并且table也不给键值对一个索引值。
函数
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的返回值
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?