[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 中 .
和 :
的分別大概就是這樣囉~
(本頁面已被瀏覽過 145 次)