自己学习的一些总结:
https://www.lua.org/manual/5.3/ 全局变量不需要声明,全局变量不需要声明 local 局部变量,只在代码块有效,尽量使用局部变量 Lua是动态类型语言,变量不需要类型定义 nil boolean number string userdata function thread table 只有flase与nil为假,只其全是真 函数type可以测试类型 如:print(type(type)) -->function type返回的永远是一个string 任何一个变量都没有预定义类型,每个变量可以包含任意一种类型 没有初始化的全局变量值为nil;(空) 删除全局变量,只需要把值变为nil;当一个值不为nil时,这个变量才为存在 Lua关键字 and break do else elseif end false for function if in local nil not or repeat return then true until while 单行注释:-- 多行注释:--[[ ]] 在控制结构中,除了false与nil为假,其他值都为真,Lua中认为0和空字符串都是真 number表示实数,整数与浮点数 a="one string" b = string.gsub(a,"one","two") 字符串替换 print("he".."he") --> "hehe" print(10 ..20) --> 1020 连接符,数字后加空格,防止变成小数点 tonumber(string) 把一个字符串转成数字,不成功返回nil tostring(number) 关系运算符 ==与~=比较,两个值类型不同,则两者不同;nil只和自己相等 两个table比较的话,只是比较他们的引用地址是否相同 逻辑运算符 and or not a and b 如果a为false,则返回a,否则返回b a or b 如果a为true,则返回a,否则返回b and优先级大于or 三元运算 (a and b) or c 只有 ^ .. 是右结合 x^y^z --> x^(y^z) 语句 if 判断 then elseif 判断 then else end for i = 1,100,2 do --1.初始值 2.终止值(如果是个函数,只会执行一次) 如果没有上限,使用math.huge 3.增加值 数字型 end do --作用域,可以在这个里面使用局部变量 end repeat --只有在条件为真时,才会结束 until 条件 for 泛型,用于遍历数组的迭代器 for k,v in ipairs(s) do print(v) end --打印下标从1开始到nil或不连续的 for k in pairs(s) do print(k) end --打印table中所有的key return 如果是直接跳出的话 do return end 的格式写 随机数 math.randomseed(os.time()) n = math.random(1,20) 函数 function name(...) print(arg) --不定参数,可以传任意个 end function name() return //可以直接返回,可以返回多个,使用,号分开 end 当使用的函数在最后一个时,返回所有值,否则只返回一个值 function test() return 10,20,30 end a,b,c,d = 10,test() --> 10 10 20 30 a,b,c,d = test(),10 --> 10 10 nil nil 闭合函数 在一个函数中,使用另一个函数 非全局函数 (1)函数为表成员 --如写一个副本,其中进入,离开函数可以这样写 lib = {} lib.foo = function (x,y) return x+y end lib.goo = function (x,y) return x-y end (2)定义为local的函数 local f = function (<参数>) end 闭合函数,在里面这样声明,i的值不会被覆盖 function count() local i = 0 return function() //可以返回一个没有名字的函数 i = i+1 return i end end local func = count() print(func()) -->1 print(func()) -->2 每次调用闭合函数时,函数中的局部变量不会被重置 function count() return function() local i = 0 //如果这个局部变量是在没有名字的函数下,他的值会被重置 i = i+1 return i end end local func = count() print(func()) -->1 print(func()) -->1 local function count() == local test end test = function() end 对于非全局函数的执行顺序,可以先声明一个变量来接收这个函数,防止成空 尾调用,就是一个函数在最后一句调用一另一个函数,这属于尾调用 function name() return next() end function name() return next() + 1 //这个不属于尾调用 end 好处:该函数意味的结束了,不需要保存该函数的数据,可以无数嵌套尾调用。主要用来实现状态机 Lua table(表) 初始化:days = { "sunday", "monday", "tuesday" } 所引从1开始 table中,以字符串做下标的,都是无序的 a = { x = 0, y = 0 } == a = {} a.x = 0 a.y = 0 使用a.x或a["x"] 泛型迭代器,遍历表 a = { x = 10, y = 20 } for k,v in pairs(a) do //k为key,v为value,a为表名 print(k,v) end for k,v in ipairs(a) do //只会遍历没有key的,下标为1的,如没有,则退出,如days = { "sunday", "monday", "tuesday" } end 如果表里只有一个数据,key的值会自动变成sex table.insert(arr,1,var) //在表中插入数据 1为那个表 2为插入的位置 3为数值 table.insert(t,4) //在t的table后面插入数据 这个插入只会一直在一个位置插入,不会把后面的数据覆盖,只会移动 table.maxn(arr) || #arr 查询表的长度 通过table实现面向对象 Enemy = {} local this = Enemy --声明局部变量this来进行 相当于类的调用 Enemy.name = "gui" Enemy.hp = 1000 Enemy.speed = 12.3 Enemy.Move = function() print("移动") end function Enemy.Attack() print("攻击") end ------------------------------定义方法时用.或:时的区别-------------------------------- function person.eat(self) --用.声明的方法,需要传递调用者 print(self.name .. "在吃饭") endfunction person:eat() --用:声明的方法,不用传递调用者,就可以在内部使用self print(self.name .. "在吃饭") end---------------------------self相当调用者,当前的表----------------------------------- 当通过:调用的时候,系统会自动传递当前的table给self, 当通过. 来调用方法的时候,self不会自动赋值,我们必须通过第一个参数来传递当前的table 实现一个表可以多个使用,像C#中是new一样 先定义一个原型 例: Person = { name = "ll", age = 21 } function Person:eat(o) print(self.name .. "oooo") end function Person:new(o) --通过设置原来实现 t = o or { } --一般会 local setmetatable( t, { __index = self } ) --调用一个属性的时候,如果t中不存在,那么会在__index 所指定的table中查找 setmatatable(t, self) self.__index = self return t end person1 = Person:new(nil) --相当于创建一个新的表,可以在原有的表中在次增加 person1.name------------------------------------------------------------------
