Lua中呼叫函式使用點號和冒號的區別

2021-08-04 15:39:23 字數 2513 閱讀 1696

這篇文章主要介紹了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的朋友來說,這簡直就是噩夢,為嘛函式的呼叫有兩種形式,是讓我們隨便挑的意思嗎?這兩種形式是有區別的,區別很大,但只有乙個。不過,暫時不解釋,後...