快速体验,学习lua(一种可嵌入c++,c#,android,object-c等并进行互调支持热更新的脚本)的入门调试系列(2)
--这里是注释 --[[ 功能备注:lua快速体验,学习,了解语法(数组,表,元表,操作符) 创建时间:2020-6-27 创建人:pcw --]] print("--------------------------------"); --【数组】 array1={"中国","美国","德国","日本"}; for i=1,table.getn(array1) do --table.getn就是获得表,数组的长度 print("数组元素",array1[i]) end array2={}; for i=-2,table.getn(array2) do --虽然数组索引默认从1开始,但也可以指定负数或0开始 array2[i]=i*2; print(array2[i]); end print("--------------------------------"); --【二维数组基础上打印乘法口诀表】 array3={}; for i3=1,9 do array3[i3]={}; for j3=1,i3 do array3[i3][j3]=i3*j3; end end strResult3=""; for i3=1,table.getn(array3) do for j3=1,table.getn(array3[i3]) do strResult3=strResult3..i3.."*"..j3.."="..array3[i3][j3].." "; end strResult3=strResult3.."\r\n"; end print(strResult3); --证明lua中的二维数组是参差数组, print(array3[1][5]);--不存在的元素,值是nil print("--------------------------------"); --【table的常用操作】 table4={"k1","a2","d5","b","222"}; for k,v in ipairs(table4) do print(k,v); end table.sort(table4);--集合排序 for k,v in ipairs(table4) do print(k,v); end print("--------------------------------"); --【元表:元表是表】--__index 可以是表也可以是函数 print("关于元表:元表是表"); normaltable={white=100}; _index_Table={green=212}; metatable={__index=_index_Table}; tableSetMetatable=setmetatable(normaltable,metatable); print("tableSetMetatable.white=",tableSetMetatable.white); print("tableSetMetatable.green=",tableSetMetatable.green); print("tableSetMetatable.red",tableSetMetatable.red); --[[ 输出结果: 关于元表 tableSetMetatable.white= 100 tableSetMetatable.green= 212 tableSetMetatable.red nil ]] print("--------------------------------"); --【元表:元表是函数】--__index 可以是表也可以是函数 print("关于元表:元表是函数"); tableAsFunForMetatable=setmetatable( {cn="棒棒的,5000年历史的伟大的国家"}, { __index=function(tableAsFunForMetatable,key) if key=="usa" then return "美国:帝国,霸权主义,资本吸血鬼"; elseif key=="jp" then return "日本: 不好好反省二战的罪行. 需要提防"; else return nil; end end }) print("tableAsFunForMetatable.cn=",tableAsFunForMetatable.cn); print("tableAsFunForMetatable.usa=",tableAsFunForMetatable.usa); print("tableAsFunForMetatable.jp",tableAsFunForMetatable.jp); print("tableAsFunForMetatable.au",tableAsFunForMetatable.au); print("--------------------------------"); --【元表:元表中的__newindex元方法】--__newindex (存在的key则不赋值给表,只更新元表。 存在的则更新表而不更新元表) print("关于元表:元表中的__newindex方法"); metatableForNewIndex={}; tableForTestNewINdex=setmetatable({k1="v1"}, {__newindex=metatableForNewIndex}); print("tableForTestNewINdex.k1=",tableForTestNewINdex.k1); tableForTestNewINdex.k2="v2"; print(tableForTestNewINdex.k2,metatableForNewIndex.k2); tableForTestNewINdex.k1="v1_newvalue"; print(tableForTestNewINdex.k1,metatableForNewIndex.k1); --[[ 输出结果: 关于元表:__newindex 注:存在的key则不赋值给表,只更新元表。 存在的则更新表而不更新元表 tableForTestNewINdex.k1= v1 nil v2 v1_newvalue nil ]] print("--------------------------------"); --【元表:元表中的__newindex元方法,引入rawset支持更新-__newindex (存在的key则不赋值给表,只更新元表。 存在的则更新表而不更新元表) print("元表:元表中的__newindex元方法,引入rawset支持更新-__newindex"); tableForTestNewINdex2=setmetatable({k1="v1"}, {__newindex=function(tableForTestNewINdex2,key,value) rawset(tableForTestNewINdex2,key,"\""..value.."\""); end }); print("tableForTestNewINdex2.k1=",tableForTestNewINdex2.k1); tableForTestNewINdex2.k2="v2"; print(tableForTestNewINdex2.k2,tableForTestNewINdex2.k2); tableForTestNewINdex2.k1="v1_newvalue"; print(tableForTestNewINdex2.k1,tableForTestNewINdex2.k1); --[[ 输出结果: 关于元表:__newindex 注:存在的key则不赋值给表,只更新元表。 存在的则更新表而不更新元表 tableForTestNewINdex.k1= v1 nil v2 v1_newvalue nil ]] print("--------------------------------"); print("元表:添加表运算符 ,table之间相减(添加__sub元方法) "); function tb_maxn(t) --table.maxn在lua5.2以上已废除 local max=0; for k,v in pairs(t) do if(k>max) then max=k; end end return max; end function tb_getIndexByKey(t,skey) --table.maxn在lua5.2以上已废除 local index=0; for k,v in pairs(t) do --对于非键值对的,k是从1开始的序号,v是元素? index=index+1; if(v==skey) then return index; end end return 0; end tableForTestSub=setmetatable( {"cn","usa","en","jp","ru","ge"}, { __sub=function(tableForTestSub,newtable) local indexOfDelete=0; for k,v in pairs(newtable) do indexOfDelete=tb_getIndexByKey(tableForTestSub,v); if(indexOfDelete>0) then table.remove(tableForTestSub,indexOfDelete); end end return tableForTestSub; end }); print(tb_getIndexByKey(tableForTestSub,"jp")); print("全部国家(tableForTestSub)"); for k,v in pairs(tableForTestSub) do print(k,v); end secondtable={"usa","jp"}; print("有野心,搞霸权的国家(secondtable)"); for k,v in pairs(secondtable) do print(k,v); end tableForTestSub=tableForTestSub-secondtable; print("对中国比较友好的国家(tableForTestSub=tableForTestSub-secondtable)"); for k,v in pairs(tableForTestSub) do print(k,v); end print("--------------------------------"); print("元表:__call元方法"); tableForTestCall=setmetatable( {"cn","usa","en","jp","ru","ge"}, { __call=function(tableForTestCall,newtable) local indexOfDelete=0; for k,v in pairs(newtable) do indexOfDelete=tb_getIndexByKey(tableForTestCall,v); if(indexOfDelete>0) then table.remove(tableForTestCall,indexOfDelete); end end return tableForTestCall; end }); secondtableForCall={"usa"}; tableForTestCall=tableForTestCall(secondtableForCall) print("支援中国抗疫的国家:"); for k,v in pairs(tableForTestCall) do print(k,v); end --[[ 输出结果: 1 cn 2 en 3 jp 4 ru 5 ge ]] print("--------------------------------"); print("元表:__tostring元方法"); tableForTestToString=setmetatable( {"cn","usa","en","jp","ru","ge"}, { __tostring=function(tableForTestToString) explainStr=""; for k,v in pairs(tableForTestToString) do explainStr=explainStr..v..","; end return explainStr; end }); print(tableForTestToString); --[[ 输出结果: cn,usa,en,jp,ru,ge, ]] print("--------------------------------"); print("尝试读取文件"); function readFileContent(sFile) -- 以只读方式打开文件 file = io.open(sFile, "r") -- 设置默认输入文件为 test.lua io.input(file) -- 输出文件第一行 sResult=io.read(); -- 关闭打开的文件 io.close(file); return sResult; end print("尝试读取文件readFileContent(\"fileRead.txt\")"); print(readFileContent("fileRead.txt")); --[[ 输出:nihao,这里从文件读出来的 ]] print("尝试读取文件pcall(readFileContent,exceptionProcess2,\"fileRead.txt\""); xpcall(readFileContent,exceptionProcess2,"fileRead.txt");--这里为什么出错 --[[ stack traceback: configlab.lua:120: in function <configlab.lua:119> [C]: in function 'open' configlab.lua:141: in function <configlab.lua:139> [C]: in function 'xpcall' configlab.lua:152: in main chunk [C]: ? ]] function writeFileContentByAppend(sFile) -- 以附加的方式打开只写文件 file = io.open(sFile, "a"); -- 设置默认输入文件为 test.lua io.output(file); -- 输出文件第一行 io.write("--write by lua"); -- 关闭打开的文件 io.close(file); end print("尝试写入文件"); writeFileContentByAppend("fileRead.txt");
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端