Lua函数与表+Lua子文件加载与元表

[复制链接]
发表于 8 小时前 | 显示全部楼层 |阅读模式
Lua函数干系示例代码 
  1. --脚本型语言,不能先调用,再定义,因为代码是从上往下执行的
  2. --第一种声明函数
  3. function func1()
  4.     print("这是func1")
  5. end
  6. --先定义,再调用,没有问题
  7. func1()
  8. ------------------------------------------------------
  9. --将函数定义为一个变量,函数是一种数据类型
  10. local func2=function()
  11.     print("这是func2")
  12. end
  13. func2()
  14. --------------------------------------------------
  15. local func3=function(a,b)
  16.         print(a+b)
  17. end
  18. --函数的调用,参数可以多于形参,但是不能少于形参
  19. func3(5,7)
  20. func3(5,7,9)
  21. ----------------------------------------------------
  22. local func4=function(...)
  23.         --将无固定参数,转换为table
  24.         --arg的作用域是func4函数体
  25.         local arg={...}
  26.         local total=0
  27.         for k,v in pairs(arg)
  28.         do
  29.                 total=total+v;
  30.         end
  31.         print(total)
  32. end
  33. func4(1,2,3)
  34. func4(1,2,3,4)
  35. --------------------------------------------
  36. function func5()
  37.         return 99,100
  38. end
  39. --将多返回值,同时赋值给两个变量
  40. local num1,num2=func5()
  41. print(num1,num2)
  42. --丢掉数值接受
  43. local _,n2=func5()
  44. print(n2)
复制代码
Lua的表(table)干系示例代码:
  1. --Table支持数字索引存储数据
  2. --Table支持字符串索引(关联索引)存储数据
  3. local data={one="cc","aa","bb",[4]=3,[-1]=4,["two"]="dd"}
  4. print(data[2])
  5. print(data["one"])
  6. print(data.two)
  7. data.func1=function()
  8.         print("data表中的func1函数")
  9. end
  10. --所以data.func1调用数据,是个函数,也就调用了函数
  11. data.func1()
  12. -----------------------------------------------------
  13. data.func2=function()
  14.         print(data.two)
  15. end
  16. data.func2()
  17. -----------------------------------------------------
  18. --第一种self调用写法
  19. --成员函数定义时,显示加入self变量,对应C#的this关键字
  20. --函数内部可以通过self变量获取当前table的其他值或函数
  21. data.func3=function(self)
  22.         print(self.two)
  23. end
  24. --调用时,必须使用":",因为":"调用,会对self关键字赋值
  25. data:func3()
  26. -----------------------------------------------------
  27. --第二种self调用写法
  28. --隐式给self赋值
  29. function data:func4()
  30.         print("func4:"..self.two)
  31. end
  32. data:func4()
复制代码
Lua的require语法干系示例代码:
  1. --实现代码的切分
  2. --将提供的Lua文件中的代码执行一下
  3. --文件名中包含特殊字符,比如".",会导致加载错误
  4. --文件扩展名".lua"不需要编写,因为会自动添加
  5. require("HelloWorld")
  6. --表会记录已经加载的文件记录
  7. print(package.loaded["requireTest"])
  8. package.loaded["requireTest"]=nil
  9. --当每次加载文件时,都会检查package.loaded里面的内容,防止重复加载
  10. --package.loaded存储的是加载的路径字符串
  11. --所以如果想重复多次加载一个文件,则需要再次加载前清除这个状态
  12. require("requireTest")
  13. --加载文件的相对路径
  14. --"./"表示当前编写的Lua文件,所在的目录
  15. --"../"表示当前编写的lua文件,所在的上级目录
  16. --获取另一个文件的局部变量
  17. --子文件的return会返回给主文件的变量
  18. local config=require("config")
  19. print(config.appName)
  20. --全局变量可以跨文件直接获取,但十分不推荐(安全性低,极容易被覆盖)
复制代码
此为config文件中的内容 

Lua元表干系示例及代码:
  1. local t1={1,2,3}
  2. --直接打印表,显示的是内存地址
  3. --希望打印table时,以人类易于阅读的结构显示例:{1,2,3},方
  4. --便调试
  5. --打印时,就是将表作为字符串输出
  6. --实现的功能,当需要将表作为字符串使用时,应该有一种办法
  7. --这种办法,Lua提供了这种语法特性,metatable扩展,元表扩展
  8. print(t1)
  9. local meta={
  10.         --用于扩展t1的元表,只要在元表中实现一些特殊的函数,
  11.         --则t1就可以实现一些特殊功能,比如让t1作为字符串可以使用
  12.         __tostring=function(t)   --元方法,当被扩展的表被以string方式调用时,调用
  13.                         local format="{"
  14.                         for k,v in pairs(t)
  15.                         do
  16.                                 format=format..v..","
  17.                         end
  18.                         format=format.."}"
  19.                         return format
  20.                 end
  21. }
  22. setmetatable(
  23.         t1,    --需要进行元表扩展的数据表
  24.         meta
  25. )
  26. setmetatable(
  27.         t2,    --需要进行元表扩展的数据表
  28.         meta
  29. )
  30. --t1会被传递给t
  31. print(t1)
  32. print(t2)
复制代码
 Lua小实践
得到不规则Table的正确长度
  1. local TOOL={}
  2. function TOOL:table_count(t)
  3.         local count=0
  4.         for k,v in pairs(t)
  5.         do
  6.                 count=count+1
  7.         end
  8.         return count
  9. end
  10. local data={one="cc","aa","bb,",[4]=3,[-1]=4,["two"]="dd"}
  11. print(TOOL:table_count(data))
复制代码

使用函数将无固定值的参数举行排序(冒泡排序法),并返回参数个数 
  1. function maopao(...)
  2.         local nums={...}
  3.         --print(nums[1])
  4.         for i = 1,#nums
  5.         do
  6.                 for j = 1,#nums-i
  7.                 do
  8.                         if(nums[j]>nums[j+1])
  9.                         then
  10.                                 local tmp=nums[j]
  11.                                 nums[j]=nums[j+1]
  12.                                 nums[j+1]=tmp
  13.                         end
  14.                 end
  15.         end
  16.         return #nums,nums
  17. end
  18. local l,t = maopao(7,1,23,8,99,26)
  19. print(l)
  20. print("------------------------------------")
  21. print(t[1])
  22. print(t[2])
  23. print(t[3])
  24. print(t[4])
复制代码

使用元表的_add元方法,实现两个Table的全部元素的归并 
  1. local t1 = {1,2,3}
  2. local t2 = {4,5,6}
  3. local meta={
  4.         __add=function(t1,t2)
  5.                 local new_t={}
  6.                 for k,v in pairs(t1)
  7.                 do
  8.                         --将数据插入到一个表中,List.Add()
  9.                         table.insert(new_t,v)
  10.                 end
  11.                 for k,v in pairs(t2)
  12.                 do
  13.                         table.insert(new_t,v)
  14.                 end
  15.                 return new_t
  16.         end,
  17.         __tostring=function(tt)
  18.                 local format="{"
  19.                 for k,v in pairs(tt)
  20.                 do
  21.                         format = format..v..','
  22.                 end
  23.                 format=format.."}"
  24.                 return format
  25.         end
  26. }
  27. setmetatable(t1,meta)
  28. local t3 = t1 + t2
  29. setmetatable(t3,meta)
  30. print(t3)
复制代码



该系列专栏为网课课程条记,仅用于学习参考。


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
继续阅读请点击广告

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
回复

使用道具 举报

×
登录参与点评抽奖,加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表