2011年5月18日 星期三

Lua functions in table & syntactic sugar

前言

這篇主要的目的在於講解 Lua 的 functions 在 table 中,可以特殊宣告/呼叫的語法。順帶一提的是,這個特殊語法可以實現 OO 裡 method 的概念。

 

語法糖(syntactic sugar)

程式的世界裡,如果用另一種句法可以更簡潔的編寫、更清晰的表達程式,但完全符合原本的行為,就叫做 syntactic sugar。

用以下的範例來示意 Lua 的 syntactic sugar

呼叫 table 內的 function

-- object.method(self, args)
goodman.speak(goodman, "hi")

syntactic sugar

-- object:method(args)
goodman:speak("hi")

 

這兩種寫法是等價的,只要 function 儲存在 table 內,就可以利用「冒號」,將自身當成第一個參數傳入。

 

實際範例

以下四個範例皆會得到一樣的結果

例子一(宣告/呼叫皆用 syntactic sugar)

goodman = {name = "Good Man"}
 
function goodman:speak(str)
    print("i am " .. self.name)
    print(str)
end
 
goodman:speak("hi")
 
-- output is :
-- i am Good Man
-- hi

例子二(宣告/呼叫皆不用 syntactic sugar)

goodman = {name = "Good Man"}
 
function goodman.speak(self, str)
    print("i am " .. self.name)
    print(str)
end
 
goodman.speak(goodman, "hi")
 
-- output is :
-- i am Good Man
-- hi

例子三(宣告用普通的方式,呼叫用 syntactic sugar)

goodman = {name = "Good Man"}
 
-- 亂定義一個 aaa,再利用 syntactic sugar 傳入值也可以
function goodman.speak(aaa, str)
    print("i am " .. aaa.name)
    print(str)
end
 
goodman:speak("hi")
 
-- output is :
-- i am Good Man
-- hi

例子四(宣告用 syntactic sugar,呼叫用普通的方式)

goodman = {name = "Good Man"}
 
function goodman:speak(str)
    print("i am " .. self.name)
    print(str)
end
 
goodman.speak(goodman, "hi")
 
-- output is :
-- i am Good Man
-- hi

 

註:若用 syntactic sugar 進行宣告,則第一個參數名稱必定為 self。

 

底下這個例子,用普通的方式呼叫 goodman 裡面的 function,但傳入另一個 table - badman(實際應用上不太會出現的例子,只是為了更清楚的解釋)

badman = {name = "Bad Man"}
goodman = {name = "Good Man"}
 
-- 這邊用 goodman 的 syntactic sugar 宣告 function
function goodman:speak(str)
    print("i am " .. self.name)
    print(str)
end
 
-- 這邊傳入 badman ...
goodman.speak(badman, "hi")
 
-- output is :
-- i am Bad Man
-- hi

以上的例子可以看到,雖然在goodman.speak function 裡面用的是 self,但其實指到的是 badman 這個 table。

 

參考連結

沒有留言:

張貼留言