沒想到距離上一篇基礎(chǔ)補(bǔ)充已經(jīng)過了1年多了,最近準(zhǔn)備撿回Lua,把基礎(chǔ)都補(bǔ)補(bǔ),今天來聊聊Lua的函數(shù)吧~
0.環(huán)境
我突然對(duì)Lua又大感興趣的最主要原因是,Cocos Code IDE開始浮出水面了,它是Cocos2d-x官方出的一款專門針對(duì)Cocos2d-x+Lua或JS的IDE,試著用了,雖然不能說很完美,但,很值得期待。
所以,本文使用的Lua編輯器就選它了,大家就隨意吧~
1.掃盲——Lua的函數(shù)
Lua要?jiǎng)?chuàng)建和調(diào)用函數(shù)都十分簡單,如代碼:
復(fù)制代碼 代碼如下:
function mutou()
print("這絕對(duì)不是廣告:www.jb51.net");
end
這就創(chuàng)建了一個(gè)函數(shù)了,調(diào)用函數(shù)也十分簡單:
復(fù)制代碼 代碼如下:
mutou();
然后運(yùn)行,就能看到輸出了,print也是一個(gè)函數(shù),唉,不多嘮叨了。
2.掃盲——函數(shù)的參數(shù)
剛剛的mutou函數(shù),我們修改一下參數(shù),如代碼:
復(fù)制代碼 代碼如下:
function mutou(name, age)
print(name);
print(age);
end
我們給mutou添加兩個(gè)參數(shù),一個(gè)是name,代表名字,一個(gè)是age,代表年齡。
順便一提,Lua是沒有變量類型這一說法的,變量會(huì)根據(jù)賦予的值而展現(xiàn)出不一樣的類型。
我們?cè)囋囘@樣調(diào)用mutou函數(shù):
復(fù)制代碼 代碼如下:
mutou("木頭", 25);
然后運(yùn)行,輸出如下:
復(fù)制代碼 代碼如下:
[LUA-print] 木頭
[LUA-print] 25
很正常,我喜歡~
3.海量的心——函數(shù)參數(shù)個(gè)數(shù)自適應(yīng)
Lua的函數(shù)心胸比較寬廣,對(duì)于我們傳遞進(jìn)去的參數(shù),全部都會(huì)忍受,但,它會(huì)按照它的規(guī)則進(jìn)行篩選。
繼續(xù)剛剛那個(gè)mutou函數(shù),我們?cè)囋囘@樣調(diào)用:
復(fù)制代碼 代碼如下:
mutou("木頭");
少給了一個(gè)參數(shù),但,這和C++或者Java等語言不一樣,它不會(huì)造成編譯錯(cuò)誤,仍然可以正常運(yùn)行。輸出如下:
復(fù)制代碼 代碼如下:
[LUA-print] 木頭
[LUA-print] nil
對(duì)于缺少的參數(shù),它會(huì)自動(dòng)用nil來代替。
再然后,既然可以少給參數(shù),那自然也可以多給參數(shù)了,試試這樣調(diào)用:
復(fù)制代碼 代碼如下:
mutou("木頭", 25, "旁白", 45);
(小若:你才45歲!你全身細(xì)胞都是45歲?。?br />
輸出如下:
復(fù)制代碼 代碼如下:
[LUA-print] 木頭
[LUA-print] 25
結(jié)果自然是,多出參數(shù)會(huì)被舍去。
至于這是好事還是壞事,就看是誰使用了~
4.多重返回值
沒錯(cuò),Lua似乎把我們想要的能偷懶的所有事情都給想到了,并且給實(shí)現(xiàn)了。
Lua的函數(shù)支持返回多個(gè)值,繼續(xù)修改mutou函數(shù),如下:
復(fù)制代碼 代碼如下:
function mutou(name, age)
return name, age;
end
把傳進(jìn)去的兩個(gè)參數(shù)又給return回來了,試試這樣調(diào)用:
復(fù)制代碼 代碼如下:
local name = mutou("木頭", 25);
print(name);
調(diào)用mutou函數(shù),并且用一個(gè)變量保存返回值,輸出結(jié)果為:
復(fù)制代碼 代碼如下:
[LUA-print] 木頭
因?yàn)槲覀冎挥昧艘粋€(gè)變量來保存返回值,所以即使函數(shù)返回了兩個(gè)值,我們也只能獲取到一個(gè),要想獲取到兩個(gè)值,就十分簡單了,如下:
復(fù)制代碼 代碼如下:
local name, age = mutou("木頭", 25);
print(name .. ":" .. age);
輸入結(jié)果如下:
復(fù)制代碼 代碼如下:
[LUA-print] 木頭:25
又順便一提,用符號(hào)“..”可以連接字符串,這里就不多說了~
返回值和參數(shù)一樣,如果我們嘗試用三個(gè)變量去獲取函數(shù)返回值,也不會(huì)造成編譯錯(cuò)誤,如下:
復(fù)制代碼 代碼如下:
local name, age, hehe = mutou("木頭", 25);
print(name .. ":" .. age);
print(hehe);
輸入如下:
復(fù)制代碼 代碼如下:
[LUA-print] 木頭:25
[LUA-print] nil
對(duì)于多出的變量,會(huì)賦予nil值,雖然這不會(huì)造成編譯錯(cuò)誤,但是也可能會(huì)造成運(yùn)行時(shí)錯(cuò)誤。
比如,用“..”符號(hào)去連接nil值,就會(huì)報(bào)錯(cuò)。
5.多重返回值的特點(diǎn)1——必須是表達(dá)式的最后一個(gè)元素
對(duì)于有多個(gè)返回值的函數(shù),不一定所有情況下都能返回多個(gè)值。
先來看這樣一種特別的情況,仍然是剛剛的mutou函數(shù),我們這樣調(diào)用:
復(fù)制代碼 代碼如下:
local a, b, c = "first", mutou("木", 25);
print(a);
print(b);
print(c);
輸出結(jié)果如下:
復(fù)制代碼 代碼如下:
[LUA-print] first
[LUA-print] 木
[LUA-print] 25
沒錯(cuò),Lua的賦值語句是支持逗號(hào)表達(dá)式的(也就是用多個(gè)值給多個(gè)變量賦值),排在前面的值自然就優(yōu)先賦給變量,所以變量a的值就是”first”。
不過,這不是重點(diǎn)~(小若:那你還說個(gè)毛線啊!)
重點(diǎn)是,我們把順序調(diào)換一下,如下:
復(fù)制代碼 代碼如下:
local a, b, c = mutou("木", 25), "first";
print(a);
print(b);
print(c);
輸出結(jié)果會(huì)出乎大家的意料:
復(fù)制代碼 代碼如下:
[LUA-print] 木
[LUA-print] first
[LUA-print] nil
沒錯(cuò),mutou函數(shù)的返回值變成只有一個(gè)了,這就是函數(shù)的特點(diǎn)之一:如果函數(shù)的調(diào)用不是在表達(dá)式的最后一個(gè)元素,則,最多只返回一個(gè)值。
什么?還不夠清晰嗎?那再來舉個(gè)粒子(小若:粒子你個(gè)頭?。。?br />
我們這樣調(diào)用函數(shù)…額,那個(gè),我們繼續(xù)下一條內(nèi)容。(小若:舉不出例子那你剛剛還激動(dòng)個(gè)毛線啊?。?/p>
6.多重返回值的特點(diǎn)2——強(qiáng)制返回一個(gè)值
某些情況下,我們可能會(huì)對(duì)于一個(gè)函數(shù)感到厭煩,沒錯(cuò),為什么你總是返回多個(gè)值?!(小若:還不是你自己寫的函數(shù)嗎?。?br />
如果想讓某個(gè)函數(shù)強(qiáng)制只返回一個(gè)值,可以這么做:
復(fù)制代碼 代碼如下:
local a, b = (mutou("木", 25));
print(a);
print(b);
輸入結(jié)果如下:
復(fù)制代碼 代碼如下:
[LUA-print] 木
[LUA-print] nil
我們只需要在函數(shù)調(diào)用時(shí),把函數(shù)調(diào)用放在括號(hào)中就可以了。
7.名字參數(shù)/具名實(shí)參/named arguments
最后,我們來看看比較實(shí)用的一種函數(shù)參數(shù)——名字參數(shù)。
其實(shí)“名字參數(shù)”是我自己的叫法,《Lua程序設(shè)計(jì)》第二版中是稱之為“具名實(shí)參”,但我看到英文單詞以及用法之后,我還是比較傾向于稱之為“名字參數(shù)”。
先來問大家一個(gè)問題,我們剛剛一直在討論的mutou函數(shù),有多少個(gè)參數(shù),不要回去看,1秒鐘內(nèi)回答~(小若:2個(gè)!)
第二個(gè)問題,mutou函數(shù)的age和name參數(shù)哪個(gè)在前哪個(gè)在后?0.001秒內(nèi)回答?。ㄐ∪簦夯卮鹉銈€(gè)頭?。。?br />
沒錯(cuò),我們有時(shí)候并不記得一個(gè)函數(shù)的參數(shù)順序,倒底age是第一個(gè)參數(shù)呢,還是name是第二個(gè)參數(shù)?(小若:好像哪里不對(duì)…)
于是,具名實(shí)參就派上用場(chǎng)了。
我們修改一下mutou函數(shù):
復(fù)制代碼 代碼如下:
function mutou(args)
return args.name, args.age;
end
現(xiàn)在mutou函數(shù)的參數(shù)變成了一個(gè)table,它要求table中包含name和age兩個(gè)值。
于是,我們調(diào)用mutou函數(shù)的方式就變成了這樣:
復(fù)制代碼 代碼如下:
local args = {name = "木", age = 25};
print(mutou(args));
沒錯(cuò),傳遞一個(gè)table變量給mutou函數(shù)就可以了,由于函數(shù)在取參數(shù)值的時(shí)候,是根據(jù)table的key值來獲取的,根本就不需要考慮參數(shù)順序,這就解決了我們剛剛所說的順序問題了。
8.結(jié)束
好了,關(guān)于函數(shù)的基礎(chǔ)特性,就這么多了,當(dāng)然,還有一個(gè)變長參數(shù)我沒有提到,因?yàn)檫@好像沒什么好提的~
最近我在計(jì)劃堅(jiān)持一件事情,那就是:晚上不寫游戲,哪怕遇到讓人興奮的Bug。
我想把晚上的時(shí)間都拿來充電,我的基本功實(shí)在是不夠用了,有點(diǎn)搖搖欲墜的感覺。
近期是計(jì)劃把《Lua程序設(shè)計(jì)》這本書過一遍,希望能堅(jiān)持~
計(jì)劃是每晚花一小時(shí)看書,花一小時(shí)整理教程。
今天是第一天,很累,寫教程比寫游戲累多了。
有句什么話來著,永遠(yuǎn)不要讓自己處于舒適的范圍里,好吧,堅(jiān)持…
(小若:用個(gè)毛線的省略號(hào)??!用感嘆號(hào)?。∵@樣才代表你有決心…)
我說,小若,那為什么你最后也用了省略號(hào)…
您可能感興趣的文章:- Lua中調(diào)用C++函數(shù)實(shí)例
- C++中調(diào)用Lua函數(shù)實(shí)例
- Lua學(xué)習(xí)筆記之表和函數(shù)