目录
- 环境搭建以及第一个lua程序
- 环境安装
- IDE
- 在线工具
- 变量
- 分类
- nil
- number
- string
- 运算符
- 算数运算符
- 条件运算符
- 位运算符和三目运算符
- 条件分支语句
- 循环
- 函数
- 表
- 迭代器遍历
- 表
- 基本语法
- 类
- 表的公共操作
- 多脚本执行相关概念
- 大G表
- 特殊用法
- 多变量赋值
- 多返回值
- 或和与
- 用and 和 or 实现三目运算符
- 协程
- 协程的执行
- 协程的挂起
- 协程的状态
- 元表
- 概念
- 设置元表
- __tostring
- __call
- 运算符重载
- __add
- __index
- __newindex
- 面向对象
- 封装
- 继承
- 多态
- 自带库
- 时间
- 数学运算
- 路径
- 垃圾回收
- 八股
- Lua中pairs和ipairs的区别
- Lua中常用的元方法有哪些?至少说出3个原方法
- Lua中元表的作用
- Lua中__index和__newindex有什么作用
内容转自b站up主唐老狮
环境搭建以及第一个lua程序
环境安装
luaForWindows
环境下载地址,选择download
然后找一下release版本的.exe文件加载就可以,一路Next就可以安装成功
我们可以来到cmd输入lua,出现以下情况即说明输入成功
IDE
这里只使用Sublime Text用来学习
中文版下载地址
这里如果中文版地址进不去,也可以下载英文版然后汉化
我们在桌面新建一个文件夹,新建一个txt,把后缀改成lua
这里用sublimeText打开
写一个最简单的打印语句,这里不需要分号结尾,按Ctr+B运行
在线工具
在线工具:lua在线工具
在线体验luatOS->lua测试
变量
我们可以先在sub里打开文件夹,选择我们要的文件夹
分类
简单的4种变量类型
- number
- string
- boolean
- nil
复杂的4种变量类型
- function
- table
- userdata
- thread
nil
类似于C#中的null
number
lua中所有的数值类型都是number
string
字符串拼接
print(string.format("因为我刚满%d岁", 18))--输出18
小写转大写+大写转小写
str="sdASC" print(string.upper(str))--返回一个新的字符串,而不是修改原有字符串 str"ABC" print(string.lower(str))--返回一个新的字符串,而不是修改原有字符串
翻转字符串
str="abc" print(string.reverse(str))--返回一个新的字符串,而不是修改原有字符串
字符串索引查找
str="abcdefg" print(string.find(str,"cde")) --输出 3 5 说明lua是多返回值的,并且初始索引是1
截取字符串
str="abcdefg" print(string.sub(str,3,4))
字符串重复
str="abc" print(string.rep(str,2))--如果是2就是输出abcabc,是3输出abcabcabc
字符串修改
str="abc" print(string.gsub(str,"ab","**"))--输出**c,1 1是指重复一次,如果str等于abcab 那么就会输出2
字符转ASCII码
print(string.byte("lua",1))--输出108
运算符
算数运算符
lua中没有++ – += /=这种运算符
加减乘除都和正常的高级语言相似,这里说一下lua中的幂运算
print("幂运算"..":"..2^10)
条件运算符
Lua中的不等于操作是~=
与操作是and
或操作是or
非操作是not
位运算符和三目运算符
lua不支持
条件分支语句
基础语法
a=9 if a>5 then a=10 end print(a)
加else
a=9 if a...} for i=1,#arg do print(arg[i]) end end F7(1,2,3,4,5,6,7) 1,2,"asda",true,nil} for i=1,#a do print(a[i]) end 1,2,nil,4,"1231",true,nil} print(#a)//输出2 b={1,nil,2,4,"1231",true,nil} print(#b)//输出6 {1,2,3},{4,5,6}} for i=1,#a do for j=1,#a[1] do print(a[i][j]) end end [0]=1,2,3,[-1]=4} print(a[0]) print(a[-1]) [0]=1,2,3,[-1]=4} print(a[0]) print(a[1]) print(a[2]) print(a[3]) print(a[4]) print(#a) [0]=1,2,3,4,[-1]=3,[5]=6} for i,k in ipairs(a) do print(i.."_"..k) end ["name"]="DIO",["age"]=14,["1"]=5} print(a.name) --访问 print(a["age"]) --访问 a.name="dio" --修改 print(a.name) a["stand"]="TheWorld"--新增 print(a.stand) --可以用修改的逻辑来达到删除的目的,只是把内容写成nil就可以 --年龄 age=18, --性别 sex=1, study=function() --类内声明函数 print("学习") end, love=function() print("恋爱") end } Student.speak=function() --类外声明函数 print("说话") end Student.speak() --年龄 age=18, study=function() print(age) end } Student.study() --年龄 age=18, learn=function(t) print(t.age) end } Student.learn(Student) --年龄 age=18, learn=function(t) print(t.age) end } Student:learn()--只是把.改成冒号而已 {age=1,name="123"},{age=2,name="345"}} t2={name="Theshy",sex=1} print("插入前的t1长度".." "..#t1) table.insert(t1, t2)--插入操作 print("插入后的t1长度".." "..#t1) table.remove(t1)--正常情况下是应该有第二个参数的,如果没有就移除最后被添进来的 print("删除后的t1长度".." "..#t1) table.table.remove(t1, 2)--移除指定位置 table.sort(t2) --排序 table.sort(t2,function(a,b) --在sort中实现类似lambda表达式的效果实现降序 if ab then return true end end ) tb={"123","456","789","10101"}--表的拼接 str=table.concat(tb,",") print(str) } myTable={} --设置元表函数 setmetatable(myTable, meta)--第一个参数子表 第二个参数元表 } _tostring = function() return "啦啦啦" end } mytable2 = {} setmetatable(mytable2, meta2) print(mytable2) __call = function() return "啦啦啦" end } mytable2 = {} setmetatable(mytable2, meta2) print(mytable2()) __call = function(self, b) print(self.name) -- 输出表中的name字段 print(b) end } mytable2 = { name = "喀喀喀" } setmetatable(mytable2, meta2) -- 调用表时只传入一个参数 mytable2(1) __add=function(t1,t2) return 5 end } table1={} table2={} setmetatable(table1, metaAdd) print(table1+metaAdd)--输出5 print(table1+table2)--输出5 } metaIndex.__index={age=2} table1 = {} setmetatable(table1, metaIndex) print(table1.age) -- 输出 2 age=2 } metaIndexGrandFather.__index=metaIndexGrandFather metaIndexFather={ } metaIndexFather.__index=metaIndexFather metaIndextable={} setmetatable(metaIndexFather, metaIndexGrandFather) setmetatable(metaIndextable, metaIndexFather) print(metaIndextable.age) } --meta.__newindex={} table1={} setmetatable(table1,meta) table1.age=1 print(table1.age) } Object.id=1 function Object:new() local obj={} self.___index=self setmetatable(obj,self) return Object end local myobj=Object:new() print(myobj.id) } Object.id=1 function Object:subClass(className) _G[className]={} local obj = _G[className] self.__index=self setmetatable(obj,self) --return obj end Object:subClass("LaLaLa") print(LaLaLa.id) } Object.id=1 function Object:subClass(className) _G[className]={} local obj = _G[className] self.__index=self setmetatable(obj,self) return obj end Object:subClass("GameObject") GameObject.posX=0; GameObject.posY=0; function GameObject:Move() self.posX=self.posX+1 self.posY=self.posY+1 print(self.posX) print(self.posY) end GameObject:subClass("Player") function Player:Move() end local p1=Player:subClass("Player") p1:Move() } local obj = _G[className] self.__index=self setmetatable(obj,self) obj.base=self--新加一个Base字段 return obj end } --new 实例化一张空表 function Object:new() local obj = {} self.__index = self setmetatable(obj, self) return obj end --继承 function Object:subClass(className) _G[className] = {} local obj = _G[className] obj.base=self self.__index = self setmetatable(obj, self) end Object:subClass("GameObject") function GameObject:new() local obj = {} obj.posX = 0 obj.posY = 0 setmetatable(obj, self) self.__index = self return obj end function GameObject:Move() self.posX = self.posX + 1 self.posY = self.posY + 1 end --实例化对象 local obj = GameObject:new() print(obj.posX) obj:Move() print(obj.posX) local obj2 = GameObject:new() print(obj2.posX) obj2:Move() print(obj2.posX) --多态 GameObject:subClass("Player") --继承自Gameobject function Player:Move() self.base.Move(self) --子类调用父类方法,并且参数使用自己的 end local obj3=Player:new() obj3:Move()
文章版权声明:除非注明,否则均为VPS857原创文章,转载或复制请以超链接形式并注明出处。
还没有评论,来说两句吧...