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循环

  1. 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中有索引值的数据,没有索引值的不管。

  1. 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

  1. 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_statuslocal 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,返回errorif 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并不会输出table中存储的键值对,会跳过键值对,然后顺序输出table中的值,遇到nil则会停止。而pairs会输出table中的键和键值对,先顺序输出值,再乱序(键的哈希值)输出键值对。
posted @   AiLJ-Me  阅读(95)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示