一、函數(shù)
在lua中函數(shù)的調(diào)用方式和C語言基本相同。 如print(“hello world”), z=add(x+y)。唯一的差別是,如果函數(shù)只有一個參數(shù),并且該參數(shù)是字符串或者table構(gòu)造器,那么圓括號可以省略,如print “hello world”, f{x=10,y=10}。
我對于table構(gòu)造器的理解就是它本身就是一個構(gòu)造函數(shù)或者是特殊化的結(jié)構(gòu)體。
lua為面向?qū)ο笠蔡峁┝艘粋€新的特殊語法--冒號操作符。表達(dá)式o.foo(o,x) 的另一種寫法是o:foo(x)。
復(fù)制代碼 代碼如下:
function add(a)
local sum=0
for i,v in ipairs(a) do
sum=sum+v
end
return sum
end
在以上聲明中,包含了函數(shù)名(add),參數(shù)列表(a),以及函數(shù)體。需要說明的是,Lua中實參和形參的數(shù)量可以不一致,一旦出現(xiàn)這種情況,Lua的處理規(guī)則等同于多重賦值,即實參多于形參,多出的部分被忽略,如果相反,沒有被初始化的形參的缺省值為nil。
1、多重返回值
復(fù)制代碼 代碼如下:
function maximum(a)
local pos=1
local maxx=a[1]
for i, v in ipairs(a) do
if v>maxx then
pos,maxx=i,v
end
end
return pos,maxx
end
print(maximum( {1,5,2,7,3,6} ))
--輸出 4 7
2、變長參數(shù)
lua中同一個函數(shù)可以接受不同數(shù)量的參數(shù)(參數(shù)項為 ... )
復(fù)制代碼 代碼如下:
function add(...)
sum=0
for i,v in pairs{...} do
sum=sum+v
end
return sum
end
function mul(a,b,...)
sum=a*b
for i,v in pairs{...} do
sum=sum*v
end
return sum
end
print(add(1,2,3,4,5))
print(add(1,2,3))
print(mul(1,2,3,4,5))
3、具名實參
lua中允許將多個參數(shù)合并在一個table中,當(dāng)做一個參數(shù)傳入
復(fù)制代碼 代碼如下:
function foo(person)
name=person.name
age=person.age
sex=person.sex
...
end
二、深入函數(shù)
在lua中函數(shù)和其他所有值一樣是匿名的,即它們沒有名稱,我們在操作的時候都在在操作該函數(shù)的變量。
如
復(fù)制代碼 代碼如下:
a = { p = print }
a.p("Hello World")
b = print
b("Hello World")
函數(shù)聲明的方式:
復(fù)制代碼 代碼如下:
function foo(x) return 2*x end
foo=function(x) return 2*x end
下面展示了匿名函數(shù)的方便性
復(fù)制代碼 代碼如下:
table.sort(tab,function(a,b) return a.idb.id end )
1、closure函數(shù)(閉包函數(shù))
如果一個函數(shù)寫入另一個函數(shù)內(nèi),那么這個處于內(nèi)部的函數(shù)可以訪問外部函數(shù)的局部變量。
復(fù)制代碼 代碼如下:
function newCounter()
local i = 0 --"非局部變量",該變量可以被內(nèi)部的匿名函數(shù)訪問并操作
--其值可以用于下一次函數(shù)訪問時計算
return function() --匿名函數(shù)
i = i + 1
return i
end
end
c1 = newCounter()
c2= newCounter()
print(c1())
print(c2()) --不同閉包的“非局部變量“是相互獨立的
print(c1())
print(c2())
--輸出結(jié)果為:
--1
--1
--2
--2
為了加深理解,再來看一個例子
復(fù)制代碼 代碼如下:
function power(x)
return function(y) --該參數(shù)為閉包變量傳入的參數(shù)
return y^x
end
end
power2=power(2) --power2,power3為閉包變量
power3=power(3)
print(power2(4))
print(power3(5))
--輸出
--16
--125
2、非全局函數(shù)
復(fù)制代碼 代碼如下:
Lib={}
Lib.add=function(x,y) return x+y end
Lib.sub=function(x,y) return x-y end
function Lib.add(x,y) return x+y end
function Lib.sub(x,y) return x-y end
Lib={
add=function(x,y) return x+y end
sub=function(x,y) return x-y end
}
do
local f=function(x,y) return x+y end
...
f(4,5)
end
您可能感興趣的文章:- Lua中調(diào)用函數(shù)使用點號和冒號的區(qū)別
- Lua中的模塊與module函數(shù)詳解
- Lua中的閉合函數(shù)、非全局函數(shù)與函數(shù)的尾調(diào)用詳解