之前有網友在 台灣可樂娜跨平台基地 - Corona SDK 上詢問 Corona SDK 中 table listener 與 function listener 差別。
其實 :addEventListener 時並沒有強制一定需要使用 table listener,因為它在執行 listener 函式時,對於 table 物件會使用 tableObj:listenerFunc ,而單純的 function 是正常執行 listenerFunc() ,差別是 function listener 不會因為「:」語法糖而將 table 本身帶入。
其實只要看下面範例就可以馬上清楚知道其中的差別:
local rect1 = display.newRect( 20, 20, 50, 50 )
rect1.name = "Rect1"
local rect2 = display.newRect( 100, 20, 50, 50 )
rect2.name = "Rect2"
local function onTouch1(self, event)
print(self.name)
end
local function onTouch2(event)
local self = event.target
print(self.name)
end
rect1.touch = onTouch1
rect1:addEventListener("touch", rect1 )
rect2:addEventListener("touch", onTouch2 )
以上沒有限定一定要如何宣告,端看你需要函式幫你做什麼而定。
同理下面兩個函式宣告是同等的:
function rect1:touch(event)
print(self.name)
end
rect1.touch = function(self, event)
print(self.name)
end
rect1:addEventListener("touch", rect1 )
可以看出「.」與「:」的差別了嗎?
最後一個範例:
local object = {name='Corona'}
-- 這是一般 table function 宣告方法
function object:sayHaha()
print(self.name..":Haha...")
end
object:sayHaha()
-- output: Corona:Haha...
object.sayHelo = function(self)
print(self.name..":Hello.")
end
object:sayHelo()
-- output: Corona:Hello.
-- 而不是
object.sayHelo()
-- output error self is nil
object.say = function(string)
print(string)
end
object.say("Lua is fun.")
-- output: Lua is fun.
-- 而不是
object:say("Lua is fun.")
-- 因為:的關係第一個屬性會被帶入 object 所以 output: table: 0x10d01c490
Comments
Post a Comment