Skip to main content

[Lua] 一分鐘搞懂 Corona SDK 中 「.」與「:」執行函式時的差別



之前有網友在 台灣可樂娜跨平台基地 - 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

Popular posts from this blog

[Swift3] weak 與 unowned 關鍵字

雖然在 Swift 中看起來"很像"是不需要煩惱內存管理的問題,不過實際上它還是遵循著自動引用計數 (ARC) 的規則,當一個物件沒有被其他對象引用時會自動被銷毀,如果三魂七魄沒有完全回位的話,就會有個靈體留在現世的空間裡,最經典的範例如下: 閉包(Closure)引用 classClassA { typealias Complete = ()->() var name : String var onComplete : Complete? init(_ name: String){ self.name = name print("Hello I am \(self.name)") onComplete = { print("\(self.name): onComplete!") // --> 閉包引用 self, 計數 + 1 } } deinit { print("deinit: \(self.name)") } } var a : ClassA? = ClassA("A") // --> 引用計數 + 1 a = nil // 2-1 = 1 還剩下 1 所以沒辦法銷毀 ---output------- Hello I am A 由於這邊的 onComplete 宣告為 Optional, 正確的做法要連同 onComplete 一起刪除才可以被回收,若不是 Optional 則會進入無法回收狀態: var b : ClassA? = ClassA("B") b?.onComplete = nil // --> 還好是 Optional 可以設成 nil 計數 - 1 b = nil // 計數 = 0 所以被回收 ---output------- Hello I am B deinit: B 但是做人不需要煩惱太多,這時候就出動 unowned 關鍵字讓物件可以順利被回收: onComplete = { [unowned self] in print...

[書評] 拖延心理學:為什麼我老是愛拖延?是與生俱來的壞習慣,還是身不由己?

作者: Jane B. Burka & Lenora M . Yuen 推薦指數 ★★★★★ 有時候,只是想了解事情發生原因而不是尋求解法 在這邊不是要講這本書的內容,而是想聊它對我的影響。