【笨木頭Lua專欄】基礎補充02:函數的幾個特別之處,lua專欄

來源:互聯網
上載者:User

【笨木頭Lua專欄】基礎補充02:函數的幾個特別之處,lua專欄

沒想到距離上一篇基礎補充已經過了1年多了,最近準備撿回Lua,把基礎都補補,今天來聊聊Lua的函數吧~

 

 0.環境

我突然對Lua又大感興趣的最主要原因是,Cocos Code IDE開始浮出水面了,它是Cocos2d-x官方出的一款專門針對Cocos2d-x+Lua或JS的IDE,試著用了,雖然不能說很完美,但,很值得期待。

 

所以,本文使用的Lua編輯器就選它了,大家就隨意吧~

笨木頭花心貢獻,哈?花心?不,是用心~

轉載請註明,原文地址:http://www.benmutou.com/archives/1702

文章來源:笨木頭與遊戲開發

 

1.掃盲——Lua的函數

Lua要建立和調用函數都十分簡單,如代碼:

  1. function mutou()
  2. print("這絕對不是廣告:www.benmutou.com");
  3. end

這就建立了一個函數了,調用函數也十分簡單:

  1. mutou();

然後運行,就能看到輸出了,print也是一個函數,唉,不多嘮叨了。

 

2.掃盲——函數的參數

剛剛的mutou函數,我們修改一下參數,如代碼:

  1. function mutou(name, age)
  2. print(name);
  3. print(age);
  4. end

我們給mutou添加兩個參數,一個是name,代表名字,一個是age,代表年齡。

順便一提,Lua是沒有變數類型這一說法的,變數會根據賦予的值而展現出不一樣的類型。

 

我們試試這樣調用mutou函數:

  1. mutou("木頭", 25);

 
然後運行,輸出如下:

[LUA-print] 木頭

[LUA-print] 25
很正常,我喜歡~

 

3.海量的心——函數參數個數自適應

Lua的函數心胸比較寬廣,對於我們傳遞進去的參數,全部都會忍受,但,它會按照它的規則進行篩選。

 

繼續剛剛那個mutou函數,我們試試這樣調用:

  1. mutou("木頭");

少給了一個參數,但,這和C++或者Java等語言不一樣,它不會造成編譯錯誤,仍然可以正常運行。輸出如下:

[LUA-print] 木頭

[LUA-print] nil

對於缺少的參數,它會自動用nil來代替。

 

再然後,既然可以少給參數,那自然也可以多給參數了,試試這樣調用:

  1. mutou("木頭", 25, "旁白", 45);

(小若:你才45歲!你全身細胞都是45歲!)

輸出如下:

[LUA-print] 木頭

[LUA-print] 25

 

結果自然是,多出參數會被捨去。

至於這是好事還是壞事,就看是誰使用了~

 

4.多重傳回值

沒錯,Lua似乎把我們想要的能偷懶的所有事情都給想到了,並且給實現了。

Lua的函數支援返回多個值,繼續修改mutou函數,如下:

  1. function mutou(name, age)
  2. return name, age;
  3. end

把傳進去的兩個參數又給return回來了,試試這樣調用:

  1. local name = mutou("木頭", 25);
  2. print(name);

調用mutou函數,並且用一個變數儲存傳回值,輸出結果為:

[LUA-print] 木頭

 

因為我們只用了一個變數來儲存傳回值,所以即使函數返回了兩個值,我們也只能擷取到一個,要想擷取到兩個值,就十分簡單了,如下:

  1. local name, age = mutou("木頭", 25);
  2. print(name .. ":" .. age);

輸入結果如下:

[LUA-print] 木頭:25

又順便一提,用符號“..”可以連接字串,這裡就不多說了~

 

傳回值和參數一樣,如果我們嘗試用三個變數去擷取函數傳回值,也不會造成編譯錯誤,如下:

  1. local name, age, hehe = mutou("木頭", 25);
  2. print(name .. ":" .. age);
  3. print(hehe);

輸入如下:

[LUA-print] 木頭:25

[LUA-print] nil

 

對於多出的變數,會賦予nil值,雖然這不會造成編譯錯誤,但是也可能會造成執行階段錯誤。

比如,用“..”符號去串連nil值,就會報錯。

 

5.多重傳回值的特點1——必須是運算式的最後一個元素

對於有多個傳回值的函數,不一定所有情況下都能返回多個值。

先來看這樣一種特別的情況,仍然是剛剛的mutou函數,我們這樣調用:

  1. local a, b, c = "first", mutou("木", 25);
  2. print(a);
  3. print(b);
  4. print(c);

輸出結果如下:

[LUA-print] first

[LUA-print] 木

[LUA-print] 25

 

沒錯,Lua的指派陳述式是支援逗號運算式的(也就是用多個值給多個變數賦值),排在前面的值自然就優先賦給變數,所以變數a的值就是”first”。

不過,這不是重點~(小若:那你還說個毛線啊!)

 

重點是,我們把順序調換一下,如下:

  1. local a, b, c =  mutou("木", 25), "first";
  2. print(a);
  3. print(b);
  4. print(c);

輸出結果會出乎大家的意料:

[LUA-print] 木

[LUA-print] first

[LUA-print] nil

 

沒錯,mutou函數的傳回值變成只有一個了,這就是函數的特點之一:如果函數的調用不是在運算式的最後一個元素,則,最多隻返回一個值。

 

什嗎?還不夠清晰嗎?那再來舉個粒子(小若:粒子你個頭啊!)

我們這樣調用函數…額,那個,我們繼續下一條內容。(小若:舉不出例子那你剛剛還激動個毛線啊!)

 

6.多重傳回值的特點2——強制返回一個值

某些情況下,我們可能會對於一個函數感到厭煩,沒錯,為什麼你總是返回多個值?!(小若:還不是你自己寫的函數嗎!)

 

如果想讓某個函數強制只返回一個值,可以這麼做:

  1. local a, b = (mutou("木", 25));
  2. print(a);
  3. print(b);

輸入結果如下:

[LUA-print] 木

[LUA-print] nil

 

我們只需要在函數調用時,把函數調用放在括弧中就可以了。

 

7.名字參數/具名實參/named arguments

最後,我們來看看比較實用的一種函數參數——名字參數。

其實“名字參數”是我自己的叫法,《Lua程式設計》第二版中是稱之為“具名實參”,但我看到英文單詞以及用法之後,我還是比較傾向於稱之為“名字參數”。

 

先來問大家一個問題,我們剛剛一直在討論的mutou函數,有多少個參數,不要回去看,1秒鐘內回答~(小若:2個!)

第二個問題,mutou函數的age和name參數哪個在前哪個在後?0.001秒內回答!(小若:回答你個頭啊!)

 

沒錯,我們有時候並不記得一個函數的參數順序,倒底age是第一個參數呢,還是name是第二個參數?(小若:好像哪裡不對…)

 

於是,具名實參就派上用場了。

我們修改一下mutou函數:

  1. function mutou(args)
  2. return args.name, args.age;
  3. end

現在mutou函數的參數變成了一個table,它要求table中包含name和age兩個值。

 

於是,我們調用mutou函數的方式就變成了這樣:

  1. local args = {name = "木", age = 25};
  2. print(mutou(args));

沒錯,傳遞一個table變數給mutou函數就可以了,由於函數在取參數值的時候,是根據table的key值來擷取的,根本就不需要考慮參數順序,這就解決了我們剛剛所說的順序問題了。

 

8.結束

好了,關於函數的基礎特性,就這麼多了,當然,還有一個變長參數我沒有提到,因為這好像沒什麼好提的~

 

最近我在計劃堅持一件事情,那就是:晚上不寫遊戲,哪怕遇到讓人興奮的Bug。

我想把晚上的時間都拿來充電,我的基本功實在是不夠用了,有點搖搖欲墜的感覺。

 

近期是計劃把《Lua程式設計》這本書過一遍,希望能堅持~

計劃是每晚花一小時看書,花一小時整理教程。

 

今天是第一天,很累,寫教程比寫遊戲累多了。

有句什麼話來著,永遠不要讓自己處於舒適的範圍裡,好吧,堅持…

(小若:用個毛線的省略符號啊!用驚嘆號啊!這樣才代表你有決心…)

 

我說,小若,那為什麼你最後也用了省略符號…

 




聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.