[分享] Lua functions in table & syntactic sugar

看板Programming作者 (bmzz)時間14年前 (2011/05/18 17:36), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串1/1
以下內容源自小弟的部落格,取出一些重點轉貼自 bbs http://ppt.cc/vjSF 如有錯誤煩請指教,謝謝。 ==== 前言 這篇主要的目的在於講解 Lua 的 functions 在 table 中,可以特殊宣告/呼叫的語法。 順帶一提的是,這個特殊語法可以實現 OO 裡 method 的概念。 語法糖(syntactic sugar) 程式的世界裡,如果用另一種句法可以更簡潔的編寫、更清晰的表達程式,但完全符合原 本的行為,就叫做 syntactic sugar。 用以下的範例來示意 Lua 的 syntactic sugar 呼叫 table 內的 function == code start == -- object.method(self, args) goodman.speak(goodman, "hi") == code end == syntactic sugar == code start == -- object:method(args) goodman:speak("hi") == code end == 這兩種寫法是等價的,只要 function 儲存在 table 內,就可以利用「冒號」,將自身 當成第一個參數傳入。 實際範例 以下四個範例皆會得到一樣的結果 例子一(宣告/呼叫皆用 syntactic sugar) == code start == 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 == code end == 例子二(宣告/呼叫皆不用 syntactic sugar) == code start == 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 == code end == 例子三(宣告用普通的方式,呼叫用 syntactic sugar) == code start == 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 == code end == 例子四(宣告用 syntactic sugar,呼叫用普通的方式) == code start == 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 == code end == 註:若用 syntactic sugar 進行宣告,則第一個參數名稱必定為 self。 底下這個例子,用普通的方式呼叫 goodman 裡面的 function,但傳入另一個 table - badman(實際應用上不太會出現的例子,只是為了更清楚的解釋) == code start == 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 == code end == 以上的例子可以看到,雖然在goodman.speak function 裡面用的是 self,但其實指到的 是 badman 這個 table。 參考連結 http://www.lua.org/manual/5.1/manual.html http://lua-users.org/wiki/ObjectOrientationTutorial -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 220.128.103.223
文章代碼(AID): #1DqvC1QX (Programming)
文章代碼(AID): #1DqvC1QX (Programming)