天天看点

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