Lua中的函數(shù)精講筆記
函數(shù)的用途:
1.完成指定的任務(wù),這種情況下作為調(diào)用語(yǔ)句使用。
2.計(jì)算并返回值,這種情況下,函數(shù)作為賦值語(yǔ)句的表達(dá)式使用。
函數(shù)的參數(shù)為空,必須使用()表示函數(shù)調(diào)用。例外:當(dāng)函數(shù)只有一個(gè)參數(shù),并且這個(gè)參數(shù)是字符串或表構(gòu)造時(shí),()是可選的。
lua提供了面向?qū)ο笳{(diào)用函數(shù)的語(yǔ)法
o:foo(x)與o.f(o,x)是等價(jià)的。
lua函數(shù)的實(shí)參與形參的匹配與賦值語(yǔ)句類似,多余部分被忽略,缺少部分nil補(bǔ)足。
lua函數(shù)可以返回多個(gè)值,return后列出要返回值的列表即可返回多值
s, e = string.find("hello lua", "lua")
那么,lua是如何調(diào)整函數(shù)返回值的個(gè)數(shù)來(lái)適應(yīng)調(diào)用環(huán)境的呢?
1. use as statement,所以返回值被忽略。
2. use as expression
1).當(dāng)作為表達(dá)式最后一個(gè)參數(shù)或僅有的一個(gè)參數(shù)時(shí),根據(jù)變量個(gè)數(shù),函數(shù)盡可能多地返回多個(gè)值,不足補(bǔ)nil,超出舍去。
2).其他情況函數(shù)調(diào)用返回第一個(gè)值(如果無(wú)返回值為nil)
3).函數(shù)調(diào)用作為函數(shù)參數(shù)被調(diào)用時(shí),和多值賦值相同
4).函數(shù)調(diào)用在表構(gòu)造中初始化時(shí),和多值賦值相同
5).return f(); f()返回所有值??梢允褂美ㄌ?hào)強(qiáng)制返回一個(gè)值return (f())
c語(yǔ)言中,可以使用函數(shù)指針來(lái)調(diào)用可變的函數(shù),可以聲明參數(shù)可變的函數(shù),但不能兩者同時(shí)可變。
Lua可以這樣來(lái)調(diào)用可變參數(shù)的可變函數(shù):f(unpack(a))
unpack接受一個(gè)數(shù)組作為輸入?yún)?shù),返回?cái)?shù)組所有的元素。注意是數(shù)字,返回ipair遍歷結(jié)果
f = string.find
a = {"hello lua", "lua"}
print(f(unpack(a)))
可變參數(shù)使用...表示,Lua將可變參數(shù)放在arg的表中,含有一個(gè)域n表示參數(shù)的個(gè)數(shù)
(5.1+:用...取代了arg。如:
function printArgLen(...)
print(select("#", ...))
end
)
function select(n, ...)
return arg[n]
end
給函數(shù)參數(shù)命名:可以把表作為函數(shù)的唯一參數(shù)來(lái)實(shí)現(xiàn)命名參數(shù)的功能。
rename {old="temp.lua", new="temp1.lua"}
function rename(arg)
os.rename(arg.old, arg.new)
end
當(dāng)參數(shù)比較多,或容易混淆時(shí),可以采用命名參數(shù)。
Lua中的函數(shù)帶有詞法定界的第一類值。
第一類值: 在Lua中,函數(shù)和其他值(數(shù)值,字符串)一樣,函數(shù)可以被存放在變量中,也存放在表中, 可以作為函數(shù)的參數(shù),還可以作為函數(shù)的返回值。
詞法定界:被嵌套的函數(shù)可以訪問(wèn)他外部函數(shù)的變量。
lua的函數(shù)也可以是匿名的,當(dāng)我們提到函數(shù)名時(shí),實(shí)際上是說(shuō)一個(gè)指向函數(shù)的變量。
閉包
詞法界定加上第一類函數(shù)是一個(gè)功能強(qiáng)大的概念。
function sortbygrade(names, grades)
table.sort(names, function(n1,n2)
return grades[n1]>grades[n2]
end)
end
在匿名函數(shù)內(nèi)部grades稱為是外部的局部變量或upvalue
閉包在上下文環(huán)境中提供很有用的功能??勺鳛楦呒?jí)函數(shù)的參數(shù),可作為函數(shù)嵌套的函數(shù)(比如返回一個(gè)閉包),可以作為回調(diào)函數(shù)。利用閉包可以重新定義某個(gè)函數(shù),當(dāng)別人調(diào)用某個(gè)函數(shù)時(shí),調(diào)用到自己定義的做了安全檢查的函數(shù),從而創(chuàng)建了一個(gè)安全的環(huán)境(沙箱)
do
local oldopen = io.open
io.open = function(f,m)
if access_ok(f,m) then
return oldopen(f,m)
else
return nil, "access denied"
end
end
end
非全局函數(shù)
函數(shù)作為table的域(大部分lua庫(kù)函數(shù)使用這種機(jī)制實(shí)現(xiàn)的。如io.read,math.sin)
有3種語(yǔ)法方式:
1.
lib = {}
lib.foo = function(x,y) return x+y end
2.
lib = {foo = function(x,y)return x+y end}
3.
lib = {}
function lib.foo(x,y)
return x+y
end
(完)
相關(guān)文章
lua閉包的理解以及表與函數(shù)的幾種表達(dá)方法
本文首先通過(guò)具體的例子講解了Lua中閉包的概念,然后總結(jié)了閉包的應(yīng)用場(chǎng)合,最后探討了Lua中閉包的實(shí)現(xiàn)原理,以及l(fā)ua中表與函數(shù)的3種表達(dá)方式的匯總2015-08-08
Lua中使用table實(shí)現(xiàn)的其它5種數(shù)據(jù)結(jié)構(gòu)
這篇文章主要介紹了Lua中使用table實(shí)現(xiàn)的其它5種數(shù)據(jù)結(jié)構(gòu),本文用table為基礎(chǔ),實(shí)現(xiàn)了數(shù)組、鏈表、隊(duì)列、集合等數(shù)據(jù)類型,需要的朋友可以參考下2014-09-09

