天天看點

lua面向對象程式設計之點号與冒号的差異詳細比較

首先,先來一段在lua建立一個類與對象的代碼

Class = {}  

Class.__index = Class   

function Class:new(x,y)      

local temp = {}      

setmetatable(temp, Class)      

temp.x = x      

temp.y = y      

return tempend   

function Class:test()      

print(self.x,self.y)end    

object = Class.new(10,20)   

object:test() 

猜一下會輸出什麼結果呢?

輸出:

>lua -e "io.stdout:setvbuf 'no'" "object.lua" 

20 nil

>Exit code: 0

我們的y值怎麼沒了?

這個原因很簡單,因為我們建立一個對象的時候使用了一個 . 号

在lua程式設計第二版中,有提到當一項操作所作用的”接受者”,需要一個額外的參數來表示該接受者,這個參數通常稱為self或this

然後我們在這段代碼加上 self

object = Class.new(self,10,20)   

然後我們在看一下輸出

10 20

這下就正常了!!嗯,每次建立一個對象的時候都有寫一個self,會不會感覺很麻煩呢?lua提供了用冒号的方式在一個方法定義中添加一個額外的參數,以及在一個方法調用中添加一個額外的實參

然後代碼改成

object = Class:new(10,20)   

輸出正常:

如果,就這麼完的話,本來是一件很歡樂的事情,但是,我嘗試了一下以下代碼

function Class.new(x,y)      

出乎意料的是:

代碼正常運作….這個讓人很費解,本來,點号對方法的操作是需要一個額外的接受者,第一段代碼已經說明了這個問題,但是,現在程式有正常運作,令我真是有點費解…

然後,我接着嘗試又發現

輸出結果:

table: 003CACA0 10

這個隻不過跟第一段代碼點号和冒号的位置調換了一下,就出現了這樣的結果…

如果,你仔細想想,這裡和第一段代碼的差別,可以發現,其實,這裡就可以證明了冒号其實就是預設傳了一個實參到方法中

為了證明冒号的作用,我改動了一下代碼

function Class.test()      

輸出的結果是:

lua: object.lua:15: attempt to index global 'self' (a nil value)

stack traceback:

object.lua:15: in function 'test'

object.lua:21: in main chunk

[C]: ?

>Exit code: 1

從這裡的錯誤可以看出,沒有self這個參數,竟然,方法用的是點号,那我們試一下把對象傳進去看下能不能正常運作

object:test(object) 

遺憾的是這樣的改動是錯誤的,錯誤的結果也是一樣的

那我們這次嘗試下想剛才那樣,把方法的點号搞成一緻看下效果怎樣

object.test() 

遺憾的是跟之前不一樣,還是不能運作

回想一下,冒号的作用可以傳遞一個實參,對于方法的操作我們需要一個接受者,那麼進行以下的改動

object.test(object) 

這次輸出就正常了

這段代碼告訴了我們,想要操作一個方法就一定需要一個額外參數來表示該值,對于點号,我們必須顯示傳遞一個實參,才能使程式正常運作,而為了友善,我們可以直接使用冒号來簡化操作.

結論:

羅嗦了半天其實,可以用一下一句話來避免這個問題:

用lua進行面向對象的程式設計,聲明方法和調用方法統一用冒号,對于屬性的調用全部用點号 

搞這麼多其實,隻是加深了解罷了…歡迎交流和批評..

本文轉自 liam2199 部落格,原文連結:http://blog.51cto.com/youxilua/773047   如需轉載請自行聯系原作者