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.函數是可以作為變量存儲的
function foo(x)
print(x)
end
foo1=function(x)
print(x)
end
foo(100);
foo1(100);
100
100
10.局部函數
--函數存儲在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
local foo=function (x,y)
return x+y;
end
local function foo(x,y)
return x+y;
end
print(foo(20,20));
11.閉合函數
函數中的局部變量的值在函數調用結束後不消失而保留原值,即其占用的存儲單元不釋放,在下一次該函數調用時,該變量保留上一次函數調用結束時的值
類似于靜态局部變量(static)
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