Account = {balance = 0} function Account:new(conf) conf = conf or {} setmetatable(conf,self) self.__index = self return conf end
Account
模擬一個對象,new
方法相似於實例化一個對象,conf
可存放一些初始值做用等同於conf
是Account
的子類。mysql
解釋:Account
這個table有一個屬性balance
,經過new
函數實例化一個類繼承於Account
。在lua中類,父類都是經過table數據結構加上元表元方法來實現。
__index
是lua一個元方法,被普遍的使用在模擬實現繼承方法。訪問一個table中不存在的key,lua將會返回一個nil。
但一個表存在元表的時可能會發生改變。既訪問不存在的key時,若是這個table存在元表,就會嘗試在它的元表中尋找是否存在匹配key對應的value。sql
:
是lua面向對象的語法糖。Account:new(conf)
等同於Account.new(self, conf)
,至關於將調用者自身當作第一個參數,使用冒號調用就至關於隱式地傳遞self
參數。數據結構
元方法的定義能夠寫在new函數外面。以下:函數
Account = {balance = 222} Account.__index = Account function Account:new(conf) conf = conf or {} setmetatable(conf, self) return conf end
或者相似於lua_resty_mysql中寫法:lua
Account = {balance = 222} local mt = {__index = Account} function Account:new(conf) conf = conf or {} setmetatable(conf, mt) return conf end
- 調用:
local aa = Account:new() ngx.say(aa.balance) --222
local a = {} local b = {k = 11} setmetatable(a,b) --設置元表,僅僅設置元表並不能使lua尋找父類的方法或屬性 b.__index = b --設置元方法 b.v = 22 --給b表增長一個屬性 a.aa = 33 --給a表增長一個屬性 print(a.k) --11, 返回父類b中k的值。 print(a.v) --22,父類增長的屬性和方法均可以被子類繼承 print(b.aa) --nil,相反,父類並不能夠獲取子類的值
local t = setmetatable({}, { __call = function(t, a, b, c, d) return (a + b + c) * d end }) local res = t(1,2,3,4) --24