作者bmzz (bmzz)
站内Programming
标题[分享] Lua functions in table & syntactic sugar
时间Wed May 18 17:35:58 2011
以下内容源自小弟的部落格,取出一些重点转贴自 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