-- 包含一些实现类的示例
--[[
table中查找字段name的过程:
1.table是否有字段name:是,则返回name;否,则进入下一步
2.table是否设置了metatable:是,则下一步;否,则返回nil
3.table的metatable是否有__index字段:是,则下一步;否,则返回nil
4.table的metatable中的__index是否有name字段,是则返回__index.name;否,则返回nil
]]
--[[
1.使用metatable实现类
原理:
使用metatable中的__index字段,指向一个table名为A,A中包含了一些属性和方法。
新建一个对象,即构造了一个新的table名为B,并将B的metatable设置为A,这样B就可以访问A中的属性和方法
]]
-- Person类
Person = {}
Person.__index = Person --元表的__index字段很重要
Person.name = ""
Person.age = 0
function Person:new()
local obj = {}
setmetatable(obj, Person)
return obj
end
function Person:say(words)
print(words or "Hello")
end
-- 实现一个Person类的对象
local me = Person.new()
print(me.name) -- 输出空字符串
print(me.age) -- 输出0
me:say() -- 输出Hello
me.name = nil
print(me.name) -- me这个table本身就没有name字段,所以上面给name置为nil后,这里访问到的仍然是metatable中的name
me.name = "xiaoming"
print(me.name) -- 这里访问到的是me这个table自己的name字段
print(me:say("I am xiaoming.")) -- 调用的还是metatable的say函数
--[[
总结:
所谓的类,实际是通过metatable给一个table提供(规定)了一些默认的属性和方法。
当这个table自己有某个字段时,访问到的就是这个table自己的字段和方法。
否则,访问的是metatable提供的默认字段。
]]
(Lua中的类 - 1)在Lua中实现类
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 在人群中,有不少人对父母是有不满和抱怨的。这样的案例在这几天萨提亚课堂里看到了很多!在此过程中我也搭了个顺风车,解...