這篇文章主要介紹了lua中呼叫函式使用點號和冒號的區別,本文涉及了lua中物件導向的一些的知識,並給出了乙個簡單的類**例項,需要的朋友可以參考下
本文是物件導向預熱篇,講解函式兩種呼叫方式的區別,初學者比較容易被坑。
1.初學者最易混亂top1——呼叫函式時用點號還是用冒號?
我們來看看下面的兩句**:
複製**
**如下:
msprite.setposition(100, 20);
msprite:setposition(100, 20);
對於初次接觸lua的朋友來說,這簡直就是噩夢,為嘛函式的呼叫有兩種形式,是讓我們隨便挑的意思嗎?
這兩種形式是有區別的,區別很大,但只有乙個。
不過,暫時不解釋,後面再介紹。
2.最簡單的類
我們先來看看簡單的,來建立乙個「類」試試,如下**:
複製**
**如下:
tsprite =
function tsprite.setposition(x, y)
tsprite.x = x;
tsprite.y = y;
endtsprite.setposition(1, 2);
print("tsprite座標(" .. tsprite.x .. "," .. tsprite.y .. ")");
其實就是建立了乙個table,給這個table新增一些字段而已。
輸出結果如下:
複製**
**如下:
[lua-print] tsprite座標(1,2)
大家留意一下setposition函式,函式裡其實也是通過tsprite來呼叫x和y欄位的。
並且,我們使用setposition的方式是,使用點號,這是正宗的函式呼叫方式,記住了。
3.不用真實姓名可以嗎?——self的作用
如果大家比較敏感的話,就會發現,剛剛的例子很有問題,如果我們這樣呼叫的話:
複製**
**如下:
local who = tsprite;
tsprite = nil;
who.setposition(1, 2);
這麼做一定會報錯,雖然通過who確實可以成功呼叫setposition函式,但函式裡需要用到tsprite,而此時的tsprite已經為nil了。
於是,聰明的我們可以這麼做:
複製**
**如下:
tsprite =
function tsprite.setposition(self, x, y)
self.x = x;
self.y = y;
endlocal who = tsprite;
tsprite = nil;
who.setposition(who, 1, 2);
print("tsprite座標(" .. who.x .. "," .. who.y .. ")");
輸出結果仍然是:
複製**
**如下:
[lua-print] tsprite座標(1,2)
留意setposition的第乙個引數,我們強制要求傳入乙個引數,這個引數就是tsprite本身。
於是,在呼叫setposition函式時,傳入who,who的內容就是tsprite的內容,於是,setposition就能正常執行了。
4.發揮偷懶的傳統美德——預設的self引數,以及預設傳遞self引數
如果你讓乙個高(chao)智(ji)商(lan)猿人每次建立函式和呼叫函式都要這麼去處理self,那他一定會說「你過來一下下,我保證不打死你」。
所以,lua提供了乙個新的使用方式,沒錯,那就是冒號。
看好了,我說的是,用冒號呼叫函式。
如下**:
複製**
**如下:
tsprite =
function tsprite:setposition(x, y)
self.x = x;
self.y = y;
endlocal who = tsprite;
tsprite = nil;
who:setposition(1, 2);
第一,留意setposition函式的定義,使用了冒號;
第二,留意setposition函式的呼叫,使用了冒號。
冒號的作用就是:定義函式時,給函式的新增隱藏的第乙個引數self;呼叫函式時,預設把當前呼叫者作為第乙個引數傳遞進去。
使用了冒號之後,就相當於我們剛剛使用點號時一樣,只是我們不再需要顯式地定義self引數以及主動地傳遞who引數。
好了,這就是點號和冒號的區別了,可以說,冒號是為了給我們偷懶而誕生的。
如果是使用cocos2d-x lua來開發的話,大部分情況下都是使用冒號的。
原因很簡單,因為大部分情況下我們都要使用到self引數,就像c++的this關鍵字一樣。
5.結束
Lua中呼叫函式使用點號和冒號的區別
1.初學者最易混亂top1 呼叫函式時用點號還是用冒號?我們來看看下面的兩句 msprite.setposition 100,20 msprite setposition 100,20 對於初次接觸lua的朋友來說,這簡直就是噩夢,為嘛函式的呼叫有兩種形式,是讓我們隨便挑的意思嗎?這兩種形式是有區別...
Lua點號和冒號區別
點號和冒號的區別 定義和呼叫時 第乙個引數是否有隱藏引數self 點號 第乙個引數無隱藏引數self 冒號 第乙個引數有隱藏引數self eg local test local test function test func arg1,arg2 print arg1,arg2,self endfun...
Lua 基礎 呼叫函式時用點號還是用冒號
本文 於 我們來看看下面的兩句 msprite.setposition 100,20 msprite setposition 100,20 對於初次接觸lua的朋友來說,這簡直就是噩夢,為嘛函式的呼叫有兩種形式,是讓我們隨便挑的意思嗎?這兩種形式是有區別的,區別很大,但只有乙個。不過,暫時不解釋,後...