天天看點

09:function用法特性

01:函數的定義

optional_function_scope function function_name( argument1, argument2, argument3…, argumentn)

function_body

return result_params_comma_separated

end

optional_function_scope: 該參數是可選的制定函數是全局函數還是局部函數,未設定該參數預設為全局函數,如果你需要設定函數為局部函數需要使用關鍵字 local。

function_name: 指定函數名稱。

argument1, argument2, argument3…, argumentn: 函數參數,多個參數以逗号隔開,函數也可以不帶參數。

function_body: 函數體,函數中需要執行的代碼語句塊。

result_params_comma_separated: 函數傳回值,Lua語言函數可以傳回多個值,每個值以逗号隔開。

--函數傳回兩個值的最大值
function max(num1,num2)
if num1>num2 then
return num1
else
return num2
end
end

print(max(10,20))      

02:函數作為資料指派

sum=max
print(sum(200,100))      

03:将函數作為參數傳遞給函數

myprint=function(parm)
print("列印函數",parm)
end


function add(num1,num2,functionPrint)

result=num1+num2
functionPrint(result)
end


myprint(10)
add(10,10,myprint)
--列印函數  10
--列印函數  20      

04:多傳回值

function maxNum(a)

return a,2*a;

end

b,c=maxNum(5)
print(b,c)
--列印函數  10
--列印函數  20      

05:可選參數

Lua 函數可以接受可變數目的參數,和 C 語言類似,在函數參數清單中使用三點 … 表示函數有可變的參數

--可選參數
function test(...)
local sums={...} --{...} 表示一個由所有變長參數構成的數組  
for k,v in pairs(sums)do
print(v)
end
end
test(4,5,8)      
function average(...)
result=0
local arg={...}
for k,v in pairs(arg) do
result=result+v
end
print("總共傳入" ..#arg .." 個數")
return result/#arg
end
print(average(4,58,89,99))      

06.unpack

unpack( )函數是接受一個數組來作為輸入參數,并預設從下标為1開始傳回所有元素。

local a={1,2,3,4};
print(unpack(a))
1234      

07.具名實參

Lua中的參數機制是具有“位置性”的,也就是說在調用一個函數時,實參是通過它在參數表中的位置與形參比對起來。但有時通過名稱來指定實參也是很有用的。

将所有的實參組織到一個table中,并将這個table作為唯一的實參傳給函數,使用時可以通過table查找到需要的值。

function rename_file(arg)
print(arg.old,arg.new);
if type(arg.old) == "string" then
    print("no old name!")
    end

end

rename_file{old = "old.txt", new = "new.txt"}

old.txt new.txt
no old name!      

08.函數是可以作為變量存儲的

09:function用法特性
09:function用法特性
09:function用法特性
09:function用法特性
function foo(x)
print(x)
end

foo1=function(x)
print(x)
end
foo(100);
foo1(100);
100
100      
09:function用法特性

10.局部函數

09:function用法特性
--函數存儲在table中
lib={};
lib.foo=function(x,y)
return x+y;
end

lib.goo=function(x,y)
return x-y;
end
//或者這樣
lib={foo=function(x,y) return x+y;end,
goo=function(x,y) return x-y;end }

print(lib.foo(10,10)); --20
print(lib.goo(20,10)); --10      
09:function用法特性
local foo=function (x,y)
return x+y;
end

local function foo(x,y)
return x+y;
end

print(foo(20,20));      

11.閉合函數

函數中的局部變量的值在函數調用結束後不消失而保留原值,即其占用的存儲單元不釋放,在下一次該函數調用時,該變量保留上一次函數調用結束時的值

類似于靜态局部變量(static)

09:function用法特性
local names={"Peter","Paul","Mary"};
local grades={Peter=10,Paul=7,Mary=8};
--table.sort(names,function (n1,n2)
   -- return grades[n1]>grades[n2];
--end);

function sortbyGrade(names,grades)
    table.sort(names,function (n1,n2)
        return grades[n1]>grades[n2];
    end);
end
newTable=sortbyGrade(names,grades);
for i, v in ipairs(names) do
    print(i..':'..v);
end
1:Peter
2:Mary
3:Paul      

例子2

--閉合函數
--local i就屬于一個非局部變量,因為它既不是全局變量,也不是單純的局部變量(因為另外一個函數可以用到它)
--再來回到定義,GetCount函數裡的那個函數,加上非局部變量i,就構成了一個閉合函數了,就這麼簡單。
--對于閉合函數而已,屬于它的非局部變量,并不是在調用它的時候臨時産生的,而是和它一起存在的。
--是以每次調用閉合函數,非局部變量的值都不會被重置
function GetCount()
    local i=0;
    return function()
        i=i+1;
        return i;
    end
end

co1=GetCount(); --非局部變量i是和變量co1一起存在的不是臨時産生的
co2=GetCount();

print(co1());--1
print(co1());--2
print(co1());--3
print("..............");
print(co2());--1
print(co2());--2
print(co2());--3      

i非局部變量下

function Count()
    return function()
       local i=9;
        i=i+1;
        return i;
    end
    end
co3=Count();
print(co3());--10
print(co3());--10
print(co3());--10      
local mutou;
local pangbai;

mutou= function ()

    print("mutou");
    pangbai();
end

pangbai= function()
    print("pangbai");
end
mutou();
--mutou
--pangbai      
lib={};
--正常的函數文法
lib.foo=function()
   print("foo")
end
--構造式來建立局部函數:
--lib={goo=function() print("goo") end}

--其它
function lib.koo()
    print("koo");
end

function lib.Joo()
    print("Joo");
end
lib.foo(); --foo
lib.koo(); --koo
lib.Joo(); --Joo