[Lua] 函式定義與呼叫中,t.f() 和 t:f() 的差別
Lua 可以在 table 上定義函式,看起來會有點像是 C/C++ 的類別函式。
不過它有兩種定義方式,一種是用 . ,一種是用 : ,
我常常搞不懂,今天決定來實驗一下~
下面定義一個 table t ,
然後分別定義一個 t.f() 和 t:g() 函式:
> t = {a=1, b=2}
> function t.f() print("in f function") end
> function t:g() print("in g function", self.a, self.b) end
以 t.f() 來說,它可以直接被呼叫:
> t.f() in f function
但如果呼叫 t.g() 會失敗,錯誤訊息是說 self 是 nil,這是為什麼呢?
看起來是因為 t:g() 函式定義其實就代表 t.g(self) (: 寫法是語法糖),
因此直接呼叫 t.g() 時,相當於 self 給了 nil:
> t.g()
stdin:1: attempt to index a nil value (local 'self')
stack traceback:
stdin:1: in function <stdin:1>
(...tail calls...)
[C]: in ?
如果是用 t:g() 方式呼叫的話,相當於呼叫 t.g(t) ,
也就是把 t 代入 self 裡面,
因此函式 g() 裡面就可以正確的拿到 self.a 和 self.b 等值:
> t:g() in g function 1 2
Lua 裡也可以把函式指定到一個變數裡面,這時會怎麼樣呢?
我們可以拿這變數當函式一樣使用:
> h = t.f > h() in f function
但如果是 t.g 的話,這裡呼叫 h() 就等於呼叫 t.g() ,
因此會和前面一樣遇到 self 為 nil 的問題:
> h = t.g
> h()
stdin:1: attempt to index a nil value (local 'self')
stack traceback:
stdin:1: in function 'h'
(...tail calls...)
[C]: in ?
那要怎麼正確的呼叫 h() 函式呢?
其實就和呼叫 t.g() 函式一樣,把 t 代入 self 裡面:
> h(t) in g function 1 2
Lua 中 . 和 :的分別大概就是這樣囉~
(本頁面已被瀏覽過 191 次)