开启新篇章

第一次写博客,激动又好奇,网页界面真的是朴实无华,像极了程序员该有的样子。

开始写博客,就是想记录一下作为游戏开发工程师的成长经历,可能现在的自己对岗位也不是很了解,自己的水平也比较菜,写博客激励一下自己坚持不断的学习下去。

今天是上班的第三天,目前还在学习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。

 

posted @ 2021-05-12 20:16  郭天真  阅读(98)  评论(2)    收藏  举报