Lua基础004.

类似于委托

function testFunction(tab,fun)--fun相当于方法的委托
    for k,v in pairs(tab) do
        fun(k,v);   
    end 
end

tabF={keya="a",keyb="b"}

function f1(k,v) 
print(k.."  and  "..v);
end

testFunction(tabF,f1);
testFunction2(tabF,function(k,v)  print(k.."..匿名函数and.."..v) end)--匿名函数就是没有方法名,若函数代码较长的话,不宜写在匿名中,定义好方法供其使用

方法的可变参数

function test(a,...)--可变参数
    print(#arg)
    for k,v in pairs(arg) do--arg 是个table,最后一个key是n,value就是arg的个数
    print(k,v)  
   end
end
test()
test(10)
test(10,20,30,40)

–循环使用 while for (repeat until)

a=1
while (a<=20) do
    print("while循环有"..a)
    a=a+1
    if (a%5==0) then
        print("5的倍数"..a)
    end
end

tab={1,2,3,5}
for i=1,#tab,1 do
    print("for 循环有.."..tab[i])
end
for k,v in pairs(tab) do
    print(k.." for 循环有.."..v)
end

a=1
repeat--先循环一次,再去until里判断
    print("repeat unitl "..a);
    a=a+1
until(a==5)

局部变量与

function funVar()
    local var="cccc"
    bfff=10
end
funVar()
print(var)--nil
print(bfff)--10--虽然在方法体里,定义的,但也是全局变量

ab,cd=10,50
print(ab,cd)-->10,50
ab,cd=cd,ab--lua是先把值取出来,然后赋值
print(ab,cd);-->50,10

function getNums()
    return 10,30
end
a=getNums();
print(a);
a,b=getNums();
print(a,b)

模块.module

--这是using_module.lua文件
require "module"
print(module.name)
module.func1();
func2();--这里不能写成module.func2
module.func3()

--这是module.lua文件
module={}
module.name="module 的名字 ,相当于属性";
module.func1=function()
    print("module 的 方法 func1");
end
function func2()
    print("方法2 func2");
end
function module.func3()
    print("输出 module.func3");
end
return module;

__index

print("元表---------------------__index");
mytable={"a","b","c"}--普通表
mymetatable={
__index=function(tab,key)
    return "你使用的元表,所用的值为空 key="..key;
    --print("元表--"..key);
end
};--元表
mytable=setmetatable(mytable,mymetatable)
print(mytable[2]);--b
print(mytable[5]);--你使用的元表,所用的值为空 key=5

__newindex

print("元表---------------------__newindex");
tab1={"cc","ff","hh"};
tetaTab={
__newindex=function(tab,key,value)
    print("元表在新建一个不存在的key才会进来这里");
    rawset(tab,key,value)--把新值插入 
end
}
tab1=setmetatable(tab1,tetaTab);
tab1[1]="修改值"
tab1[4]="新值"
print(table.concat(tab1,"  :  "))

__add

print("元表---------------------a+b");
a={"a","c","d"}
b={"1",2,3}
m_a={
__add=function(oT,tT)
    maxO=0
    for k,v in pairs(oT) do
        if(maxO<k) then
            maxO=k;
        end
    end
    for k,v in pairs(tT) do
        maxO=maxO+1
        table.insert(oT,maxO,v)
    end
    return oT;
end
}
m_b={}
setmetatable(a,m_a)
setmetatable(b,m_b)
v=a+b
print(table.concat(v,"  :  "))--a  :  c  :  d  :  1  :  2  :  3
print(table.concat(a,"  :  "))--a  :  c  :  d  :  1  :  2  :  3

__tostring

print("++++++++++++++tostring")
aa={"2",1223.44,44}
m_aa={
__tostring=function(m_tab)
   --return table.concat(m_tab," : ")--输出所有值
   local strs=""--跟上面一样的效果
   for k,v in pairs(m_tab) do
   strs=strs..v..":"
   end
return strs
end
} 
setmetatable(aa,m_aa)
print(aa)--2:1223.44:44

猜你喜欢

转载自blog.csdn.net/SendSI/article/details/77801716