一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

腳本之家,腳本語言編程技術及教程分享平臺!
分類導航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務器之家 - 腳本之家 - Lua - Lua中調用函數使用點號和冒號的區別

Lua中調用函數使用點號和冒號的區別

2020-04-09 14:20笨木頭 Lua

這篇文章主要介紹了Lua中調用函數使用點號和冒號的區別,本文涉及了Lua中面向對象的一些的知識,并給出了一個簡單的類代碼實例,需要的朋友可以參考下

本文是面向對象預熱篇,講解函數兩種調用方式的區別,初學者比較容易被坑。

1.初學者最易混亂Top1——調用函數時用點號還是用冒號?

我們來看看下面的兩句代碼:

復制代碼 代碼如下:

mSprite.setPosition(100, 20);
mSprite:setPosition(100, 20);

 

對于初次接觸Lua的朋友來說,這簡直就是噩夢,為嘛函數的調用有兩種形式,是讓我們隨便挑的意思嗎?
 
這兩種形式是有區別的,區別很大,但只有一個。
不過,暫時不解釋,后面再介紹。

2.最簡單的類

我們先來看看簡單的,來創建一個“類”試試,如下代碼:

復制代碼 代碼如下:

    TSprite = {
        x = 0,
        y = 0,
    }
    function TSprite.setPosition(x, y)
        TSprite.x = x;
        TSprite.y = y;
    end
  
    TSprite.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 = {
        x = 0,
        y = 0,
    }
    function TSprite.setPosition(self, x, y)
        self.x = x;
        self.y = y;
    end
  
    local 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 = {
        x = 0,
        y = 0,
    }
    function TSprite:setPosition(x, y)
        self.x = x;
        self.y = y;
    end
    local who = TSprite;
    TSprite = nil;
    
    who:setPosition(1, 2);

 

第一,留意setPosition函數的定義,使用了冒號;
第二,留意setPosition函數的調用,使用了冒號。

冒號的作用就是:定義函數時,給函數的添加隱藏的第一個參數self;調用函數時,默認把當前調用者作為第一個參數傳遞進去。

使用了冒號之后,就相當于我們剛剛使用點號時一樣,只是我們不再需要顯式地定義self參數以及主動地傳遞who參數。
 
好了,這就是點號和冒號的區別了,可以說,冒號是為了給我們偷懶而誕生的。
如果是使用Cocos2d-x lua來開發的話,大部分情況下都是使用冒號的。
原因很簡單,因為大部分情況下我們都要使用到self參數,就像C++的this關鍵字一樣。

5.結束

下一篇正式進入面向對象的內容,希望大家還沒有忘記元表和元方法等基礎,面向對象中會用到。

延伸 · 閱讀

精彩推薦
  • LuaLua中計算、執行字符串中Lua代碼的方法

    Lua中計算、執行字符串中Lua代碼的方法

    這篇文章主要介紹了Lua中計算、執行字符串中Lua代碼的方法,類似JavaScript中eval函數的功能,在Lua中也可以實現,需要的朋友可以參考下 ...

    腳本之家6322020-04-30
  • LuaLua中的元方法__newindex詳解

    Lua中的元方法__newindex詳解

    這篇文章主要介紹了Lua中的元方法__newindex詳解,本文講解了查詢與更新、監控賦值、通過table給另一個table賦值等內容,需要的朋友可以參考下 ...

    笨木頭8872020-04-09
  • LuaLua中table庫函數方法介紹

    Lua中table庫函數方法介紹

    這篇文章主要介紹了Lua中table庫函數方法介紹,本文講解了concat、insert、maxn、remove、sort、foreachi等方法,需要的朋友可以參考下 ...

    腳本之家2502020-04-17
  • LuaLua教程(二):基礎知識、類型與值介紹

    Lua教程(二):基礎知識、類型與值介紹

    這篇文章主要介紹了Lua教程(二):基礎知識、類型與值介紹,本文講解了Hello World程序、代碼規范、全局變量、類型與值等內容,需要的朋友可以參考下 ...

    腳本之家5922020-04-28
  • LuaLua和C語言的交互詳解

    Lua和C語言的交互詳解

    這篇文章主要介紹了Lua和C語言的交互詳解,Lua和C語言通過棧完成交互,本文結合代碼實例詳細講解了交互的方法,需要的朋友可以參考下 ...

    果凍想3702020-04-14
  • LuaLua實現__add方法重載示例

    Lua實現__add方法重載示例

    這篇文章主要介紹了Lua實現__add方法重載示例,本文直接給出實現代碼,需要的朋友可以參考下 ...

    腳本之家7452020-04-24
  • Lua深入探究Lua中的解析表達式

    深入探究Lua中的解析表達式

    這篇文章主要介紹了深入探究Lua中的解析表達式,對于其語法部分的說明和示例都超詳細,極力推薦此文!需要的朋友可以參考下 ...

    腳本之家3542020-05-05
  • LuaLua簡介、編譯安裝教程及變量等語法介紹

    Lua簡介、編譯安裝教程及變量等語法介紹

    這篇文章主要介紹了Lua簡介、編譯安裝教程及變量等語法介紹,本文同時講解了lua注釋語法、Lua命令行方式等內容,需要的朋友可以參考下 ...

    junjie3632020-04-14
主站蜘蛛池模板: 国产麻豆流白浆在线观看 | wc凹凸撒尿间谍女厕hd | 日本在线一区二区 | 亚洲精品第五页 | 天天摸日日舔 | 成人免费淫片95视频观看网站 | 亚洲精品无码久久不卡 | 456亚洲人成高清在线 | 翁息肉小说老扒 | 白丝vk丨tk失禁 | 四虎免费在线观看视频 | 日本免费三片在线观看 | 4虎影院在线观看 | 成人性爱视频在线观看 | 欧美三级不卡在线观线看高清 | 福利一区二区在线观看 | 我年轻漂亮的继坶2中字在线播放 | 国产精品青青青高清在线 | 国产亚洲欧美一区二区三区 | 香蕉免费一区二区三区在线观看 | 国产高清一区二区 | 欧美在线观看网址 | 国产一级片视频 | 久久这里只有精品无码3D | 好吊色青青青国产综合在线观看 | 欧美人与禽杂交大片 | 好大好热 | 毛片免| 免费视频片在线观看 | 亚洲精品免费观看 | 好猛好紧好硬使劲好大刺激视频 | 教室眠催白丝美女校花 | 久久人妻熟女中文字幕AV蜜芽 | 国内精品视频一区二区三区八戒 | 天堂网在线.www天堂在线资源 | 国产91素人搭讪系列天堂 | 国产资源中文字幕 | 日本一区二区视频在线观看 | 午夜AV内射一区二区三区红桃视 | 国产自在自拍 | 女人是男人的未来1分49分 |