开启新篇章
第一次写博客,激动又好奇,网页界面真的是朴实无华,像极了程序员该有的样子。
开始写博客,就是想记录一下作为游戏开发工程师的成长经历,可能现在的自己对岗位也不是很了解,自己的水平也比较菜,写博客激励一下自己坚持不断的学习下去。
今天是上班的第三天,目前还在学习Lua语言,一下是这三天来的一些学习笔记。
笔记同步网址:Lua教程
笔记一 —— 第一个Lua程序、单行注释、多行注释
print("Hello World") --print用来想控制台输出字符 单行注释 --[[ 多行注释 print("Hello World") --]] ---[[ print("Hello World") --]]
笔记二 —— 全局变量、删除/销毁一个全局变量
-- nil null print(b) b=10 print(b) b = nil --删除b变量 可以直接设置为nil
笔记三 —— 数据类型、字符串的拼接、字符串的长度计算
--[[ str = type("112233") print(str) print( type("112233")) print( type(10)) print( type(1.1)) print( type(type)) print( type(print)) print( type(x)) print( type(type(x))) name = "112233" print(name) name = nil print (name) --销毁name tab1 = {key1="value1",key2="value2"} print(tab1.key1) tab1.key1 = nil tab1 = nil print(tab1) print(tab1.key1) --boolean print( type(true)) print( type(false)) print( type(nil)) if true then print(true) end if nil then print("nil被当做true处理") else print("nil被当做false处理") end --string(字符串) [[ ]] str1 = "this is string1" str2 = 'this is string2' --分号; 可加可不加 html = [[ <html> <head></head> <body> <a href="http://www.runoob.com/">菜鸟教程</a> </body> </html> ]] print(html) -- .. 两点为字符串组拼 +只做运算,自动转成number类型 print("2".."6") print("2"+"6") print('2'+ "6") --#计算字符串长度 print(#html) print(#str1) print(#str2) --]]
笔记四 —— 表以及表的遍历
tab1 = {} --空表 {}构造表达式
tab2 = {key1 = 100,key2 = "value2"} --初始化一个表
print(tab1)
print(tab1.key)
print(tab2)
print(tab2.key1)
print(tab2["key1"])
print(tab2.key2)
print(tab2["key2"])
tab3 = {"apple","pear","orange","grape"} --lua中数组是从1开始,区别于C#从0开始
print(tab3[2])
print(tab3["2"])
--遍历数组
for key,val in pairs(tab3) do
print(key..":"..val)
end
for key,val in pairs(tab2) do
print(key..":"..val)
end
--table不会固定长度大小,有新数据添加时table长度会自动增长,没初始的table都是nil。
tab1.key1 = "112233"
tab1["key2"] = "334455"
print(tab1.key1)
print(tab1["key1"])
print(tab1.key2)
print(tab1["key2"])
for key,val in pairs(tab1) do
print("tab1".."."..key..":"..val)
end
--table 中 索引是不连续的,删除二 三不会顶上来
tab2["key1"] = "556677"
for key,val in pairs(tab2) do
print(key..":"..val)
end
tab2.key1 = nil
for key,val in pairs(tab2) do
print(key..":"..val)
end
tab3[2] = nil
for key,val in pairs(tab3) do
print(key..":"..val)
end
tab3[100] = "芒果"
for key,val in pairs(tab3) do
print(key..":"..val)
end
tab3["key3"] = 300
for key,val in pairs(tab3) do
print(key..":"..val)
end
tab3 = nil --删除整个表,等于释放内存
笔记五 —— 递归函数
--[[ 在C#中:(函数递归) int fact(int n){ if(n==1) return n; else return n*fact(n-1); } --]] --在lua中 function fact(n) if n==1 then return n else return n*fact(n-1) end end print(fact(6)) function fact2(n) if n<3 then return n else return n+10 end end print(fact2(6)) fact3=fact2 print(fact2(7))
笔记六 —— 全局变量、制造语句块、多变量同时赋值
--[[ a = 5 --全局变量 local b = 6 --局部变量,局部变量销毁是在所在语句块结束。 function test() c = 7 local d = 8 end test() print(a) print(b) print(c) print(d) print(a,b,c,d) --do end 制造语句块 --]] --多变量同时赋值 a,b,c = 1,20,"hello" print(a,b,c)
笔记七 —— 循环 while 数值for循环 泛型for循环
--while循环 --[[ a = 1 while (a<=10) do if (a%2==1) then print(a) end a=a+1 end --数值for循环 for i=1,10 do print(i) end for i=1,10,2 do print(i) end for i=20,1,-3 do print(i) end --泛型for循环 tab1 = {key1="value1",key2="value2"} for k,v in pairs(tab1) do print(k,v) end --repeat until 相当于C#中的 do while repeat 循环体 until(condition) a = 1 repeat print(a) a=a+1 until(a>10) for i=1,10 do --外层循环表示输出? for j=1,i do --内层循环表示输出多少次 print(i) end end for i=1,10 do for j=1,i do print(j) end end --]] for i=1,10 do j=1 while j<=i do print(i) j=j+1 end end
笔记八 —— 流程控制/条件语句
--[[ if (布尔表达式) then 为true的时候要执行的代码 end if (布尔表达式) then 为true的时候要执行的代码 else 为false的时候要执行的代码 end if(布尔表达式) then //1 elseif(布尔表达式) then //2 else //3 end --]] --[[ if(0) then print(112233445) end if(true) then print(2) end if(nil) then print(1) end --]] if(b) then print("b不为空") else print("b为空") end a=100 if (a<=50) then print(a) elseif (a<100) then print(a) elseif (a<150) then print(a) else print("11223") end
笔记九 —— 全局函数、局部函数
--[[ 全局函数 --]] --[[ function max (num1,num2) if (num1>num2) then return num1 else return num2 end end print( max(1,10)) --]] --[[ 局部函数 --]] --[[ local function max (num1,num2) if (num1<num2) then return num1 elseif (num1==num2) then return num1+num2 else return num2 end end print( max(10,10)) --函数可以作为数据赋值,可以作为参数传递 temp = max --函数可以作为数据赋值 print(temp(2,3)) myprint = function(param) --函数作为参数传递 print("这个是我的打印函数"..param) end myprint(100) function add (num1,num2,printFun) res = num1 + num2 printFun(res) end add(40,50,myprint) --lua里面的函数可以返回多个值 function temp() return 10,15,20,30 end res1,res2,res3,res4 = temp() print(res1,res2,res3,res4) print(10,20,80) --]] function average(...) --print(arg[1]) --arg 封装表 此时输出的是表的第一个 local arg = {...} res = 0 for k,v in pairs(arg) do res = res+v --print(res.."for循环内") end --#arg 取得参数的个数 例如:#"hello" print(res/#arg) end average() average(10) average(20,30) average(40,50,60) average(70,80,90,100,101)
笔记十 —— 字符串类型与整型的转换
--[[ 格式化字符串 string.format --]] num1=23 num2=21 str1 = string.format("加法运算:%d+%d=%d",num1,num2,(num1+num2)) print(str1) s1 = string.char(97,98,99,100) --整数型 转 字符串型 i1 = string.byte("ABCD",4) --字符型 转 整数型型 print(s1,i1)
笔记十一 —— 运算符
-- + - * / % ^求幂 - --关系运算符 == ~= > < >= <= a = 25 b = 30 if (a==b) then print("a=b") else print("a~=b") end if(a~=b) then print("a不等于b") else print("a等于b") end if(a<b) then print("a小于b") else print("a大于b") end --逻辑运算符 and or not --a and b a,b都为true则结果为true则 --a or b a,b只要有一个为true,结果为true tab = {111,222,333,444,555} tab = nil tab = {key3="dd",key4 = "yy",key5="vv"} tab[1]=11 tab[2]=234 tab[3]=555 tab[4] = 666 print(#tab) --# 索引时取得的是连续的最大个数
笔记十二 —— 数组
--[[ 一维数组 --]] --[[ array = {"Lua","C#"} array[3] = "Java" for i=1,3 do print(array[i]) end array = {} for i = -2,2 do array[i]=i*3 end for i = -2,2 do print(array[i]) end --]] --[[ 二维数组 --]] --构造方法一 array = {{"小明","大明"},{"小刘","大刘"},{"小李","老李"},{"小赵","老赵"}} --二维数组 4*2 print(array[3][2]) for i = 1,4 do for j = 1,2 do print(array[i][j]) end end --构造方法二--动态构造 array = {{},{},{}} for i = 1,3 do array[i] = {} for j=1,2 do array[i][j]= i*j end end for i = 1,3 do for j = 1,2 do print(array[i][j]) end end
笔记十四 ——迭代器/遍历
--[[ 遍历,迭代器方法 --]] array = {"Lua","C#","Java"} -- 方法一 -- for k,v in pairs(array) do --pairs 就是迭代器 print(k,v) end for k,v in ipairs(array) do print(k,v) end --pairs迭代table,遍历表中所有的key跟value --ipairs按照索引从1开始,递增遍历,遇到nil值就停止 -- 方法二 --
笔记十四 —— 字符串连接方法
--[[ 字符串连接 --]] table.concat --字符串的拼接 table.concat(mytable,"-") --字符串拼接,使用-隔开 table.concat(mytable,",",2,4) --字符串拼接2-4 使用,隔开
笔记十五 是调用时使用的一个函数文档
module = {} module.var = "siki" module.func1 = function() print("这个是Module里面的函数") end --[[ --定义方法二 function module.func1() print("这个是Module里面的函数") end --]] local function func2() print("这是一个全局函数fun2") end function func3() func2() print("这是一个全局函数fun3") end return module
笔记十六 —— 模块与包
require ("module") print (module.var) module.func1() func3()
笔记十七 ——表、元表、元方法
--[[ mytable = {"Lua","Java","C#","C++"} --普通表 mymetatable = {} --元表 扩展了普通表的行为 mytable = setmetatable(mytable,mymetatable) print(mytable[3]) print (getmetatable(mytable)) print (mymetatable) mytable = setmetatable({"Lua","Java","C#","C++"},{}) --]] -----------------------------------------分割线---------------------------------------- --[[ mytable = {"Lua","Java","C#","C++"} --1,__index当访问到一个不存在的索引的时候 起作用 mymetatable = { __index = function (tab,key) return "Javascript" end } mytable = setmetatable(mytable,mymetatable) print (mytable) print (mytable[2]) print (mytable[10]) --]] mytable = {"Lua","Java","C#","C++"} --2,————newindex 当我们对表的数据进行修改的时候,当我们修改的是一个新的索引的时候 -- 当我们给表添加新的键值对的时候,会起作用 --[[ mymetatable = { __newindex = function (tab,key,value) --tab就是要修改的普通表mytable print("我们要修改的key为:"..key..",".."把这个key的值修改为"..value) end } mytable = setmetatable(mytable,mymetatable) mytable[11] ="111" --此时,赋值给了mytable的第11位,但并没有添加到mytable中,所以访问是访问不到的 print(mytable[5]) --]] --若要使mytable中加入 ”111“,方法如下:(错误方法) --[[ mymetatable = { __newindex = function (tab,key,value) --tab就是要修改的普通表mytable print("我们要修改的key为:"..key..",".."把这个key的值修改为"..value) mytable[key] = value end } mytable = setmetatable(mytable,mymetatable) mytable[11] ="111" --运行起来有报错,原因为:没有更新表,循环进入了死循环 --]] --若要使mytable中加入 ”111“,方法如下:(正确方法一) --[[ mymetatable = { __newindex = function (tab,key,value) --tab就是要修改的普通表mytable rawset(tab,key,value) end } mytable = setmetatable(mytable,mymetatable) mytable[11] ="111" print(mytable[11]) --]] --若要使mytable中加入 ”111“,方法如下:(正确方法二) --[[ newtable = {} mymetatable = { __newindex = newtable } mytable = setmetatable(mytable,mymetatable) mytable[1] = "C#" mytable[11] = "111" print(mytable[1]) print(mytable[1],mytable[2]) print(mytable[1],mytable[11]) print(mytable[1]) print(newtable[11]) --]] -----------------------------------------分割线--------------------------------------- --[[ 元表中__add的用法 --]] --[[ mytable = {"Lua","Java","C#","C++"} --普通表 mymetatable = {} --元表 扩展了普通表的行为 mytable = setmetatable(mytable,mymetatable) newtable = {"PHP","Python"} --]] --若要两表相加(mytable + newtable)直接+肯定是不行的,方法如下: --[[ mytable = {"Lua","Java","C#","C++"} --普通表 mymetatable = { --元表 扩展了普通表的行为 __add = function(tab,newtab) local mi = 0 for k,v in pairs (tab) do --这个循环是为了 测出mytable的末尾 if(k>mi) then mi = k end end for k,v in pairs(newtab) do --这个循环是为了 在mytable末尾加入newtable的数值 mi = mi+1 table.insert(tab,mi,v) end return tab end } mytable = setmetatable(mytable,mymetatable) newtable = {"PHP","Python"} v = mytable + newtable print(v) for k,v in pairs(mytable) do print(k,v) end --]] --------------------------------------分割线------------------------------------------ --[[ 元表中__call的用法 一个参数 --]] --[[ mytable = {"Lua","Java","C#","C++"} --普通表 mymetatable = { --元表 扩展了普通表的行为 __add = function(tab,newtab) local mi = 0 for k,v in pairs (tab) do if(k>mi) then mi = k end end for k,v in pairs(newtab) do mi = mi+1 table.insert(tab,mi,v) end return tab end, --因为mymetatable是元表 所以里面的元素是键值对,用,隔开 __call = function (tab,arg) print (arg) end } mytable = setmetatable(mytable,mymetatable) mytable(34) --]] --[[ 元表中__call的用法 多个参数 --]] --[[ mytable = {"Lua","Java","C#","C++"} --普通表 mymetatable = { --元表 扩展了普通表的行为 __add = function(tab,newtab) local mi = 0 for k,v in pairs (tab) do if(k>mi) then mi = k end end for k,v in pairs(newtab) do mi = mi+1 table.insert(tab,mi,v) end return tab end, --因为mymetatable是元表 所以里面的元素是键值对,用,隔开 __call = function (tab,arg1,arg2,arg3) print (arg1,arg2,arg3) end } mytable = setmetatable(mytable,mymetatable) mytable(34,112,223) --]] --------------------------------------分割线------------------------------------------ --[[ 元表中__tostring的用法 --]] ---[[ mytable = {"Lua","Java","C#","C++"} --普通表 mymetatable = { --元表 扩展了普通表的行为 __add = function(tab,newtab) local mi = 0 for k,v in pairs (tab) do if(k>mi) then mi = k end end for k,v in pairs(newtab) do mi = mi+1 table.insert(tab,mi,v) end return tab end, --因为mymetatable是元表 所以里面的元素是键值对,用,隔开 __call = function (tab,arg) print (arg) return "44556" end, __tostring = function(mytable) local str = "" for k,v in pairs(mytable) do str = str..v.."," end return str end } mytable = setmetatable(mytable,mymetatable) v = mytable(34) print(v) print(mytable) --]]
笔记十八 —— 协同函数 暂停、继续
--[[ 启动协同函数 方式一 --]] --[[ --定义协同函数,使用coroutine.create co = coroutine.create( function (a,b) --此处为匿名函数 不需要名字 print(a+b) end ) coroutine.resume(co,20,30) --启动协同函数,使用coroutine.resume --有启动、暂停协同函数的作用 co指启动哪个协同函数 --]] --[[ 启动协同函数 方式二 --]] --[[ co = coroutine.wrap( --定义协同函数,使用coroutine.wrap function(a,b) print(a+b) end ) co(20,30) --]] ----------------------------------------分割线---------------------------------------- --[[ 暂停协同函数 --]] --[[ co = coroutine.create( function (a,b) print(a+b) coroutine.yield() --函数暂停(函数被挂起),使用coroutine,yield print(a-b) end ) coroutine.resume(co,20,30) --函数启动 print("I'm here!") coroutine.resume(co) --暂停后的函数继续(不需要传递参数) --]] --[[ 继续协同函数 --]] --[[ co = coroutine.create( function (a,b) print(a+b) print(a-b) coroutine.yield(a*b,a/b) --函数暂停(函数被挂起),使用coroutine,yield print(a-b) return a%b,a/b+1 end ) res1,res2,res3 = coroutine.resume(co,10,40) print(res1,res2,res3) print("lalala") coroutine.resume(co,20,30) --函数启动 print("I'm here!") --coroutine.resume(co) --暂停后的函数继续(不需要传递参数) --]] --[[ 获取线程状态 --]] ---[[ co = coroutine.create( function (a,b) print(a+b) print(a-b) coroutine.yield(a*b,a/b) print(a-b) return a%b,a/b+1 end ) print(coroutine.status(co)) --输出线程状态 res1,res2,res3 = coroutine.resume(co,10,40) print(res1,res2,res3) print("lalala") coroutine.resume(co,20,30) print("I'm here!") res1,res2,res3 = coroutine.resume(co) print(res1,res2,res3) --第一个yield的参数作为第一个resume的返回值 --第一个resume的参数作为协程的参数,第二个resume的参数作为第一个yield的返回值 --]]
明天就可以听完Lua的课了,准备开始XLua。
浙公网安备 33010602011771号