lua面向对象编程10分钟上手
Posted 中企老徐的架构笔记
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了lua面向对象编程10分钟上手相关的知识,希望对你有一定的参考价值。
目录
① 元表和元方法
② 元方法 __index
③ 一个最简单的lua类
④ 点与冒号
1 元表和元方法
lua 里面有一种数据类型叫table
table可以说是最灵活的数据类型了
可以做数组
可以做map
甚至可以把json串直接转成table
table表的定义如下
--定义数组 t1[1] = a , t1[2] = b
table t1 = {"a","b"}
table t2 = {"c","d"}
-- 数组与map混合 t3[1] = e t3["age"] = 18
table t3 = {"e","f", username="xly", age = 18}
说了这么多,那什么是元表呢?
元表其实也是一个table,只是我们强制把它设置为另一个table的元表
是不是听起来有点绕呢,我们来看一个例子来了解下
-- 定义一个table
table t1 = {}
-- 定义一个table ,此时t1 mt都是一样table
table mt = {}
--调用setmetatable,把mt设置为t1的元表,
--是不是很暴力,一条命令就让mt当了t1的小弟(元表)
setmetatable(t1, mt)
此时的mt元表就有了一点点面向对象的味道了,因为它有元方法啊
你知道的,只有类这种东西才能有方法嘛
那什么又是元方法呢?
听名字就知道元方法出自元表啦
其实就是元表隐含的一些方法,有很多 都是以 ‘__’ 开头的,而且这些方法都可以重载的,就像c++里面重载运算符一样
这些元表里面最重要的一个就是 __index 了
2 元方法 __index
敲黑板:
特别注意
__index 可以指向一个函数,也可以指向一个table;这下牛逼大了 因为table可以自定义function,而这也是lua面向对象编程的根基
我们看一段代码来说明 __index的用法
-- 定义一个table
local t1 = {}
-- 定义一个table 并重载了它的__index方法
local mt = {__index = t1}
-- 如下代码 便是定义了一个类 myClass
local myClass = {}
setmetatable(myClass, mt)
-- 调用getName() 方法 , 肯定报错啦 我们j就没定义过这个方法嘛
myClass.getName()
我们试着解释下上面的代码
myClass调用getName 的查找过程是这样的
myClass查看自己有没有定义getName()函数
如果没有查看元表mt的__index字段
__index字段查询table t1有没有定义getName()函数
如果t1定义了getName()就调用,否则报错
现在明白报错原因了,t1没定义getName()方法嘛
在t1声明后加上就ok啦 如下代码
-- 定义一个table
local t1 = {}
tl.getName = function return "xly" end
.......
-- 这样调用就不报错啦
myClass.getName()
有了上面的基础 我们写一个最简单类吧
3 一个最简单的lua类
user.lua
_M = {}
_mt = {__index = _M}
function _M.getName(self)
return self.name
end
function _M.new(self, name)
local t = {name = name}
setmetattable(t, mt)
end
return _M
调用代码
local user = require "user.lua"
local u = user:new("xly")
local name = u:getName()
print(name) -- output 'xly'
点与冒号
其实这是个语法糖
但一不小心写错了,可能要调试好久
所以建议大家固定一种方式
上面的代码可以换成‘.’的调用方式 如下代码
local name = u:getName() --冒号写法,隐式传参
local name = u.getName(u) -- 点号写法 显示传参
两种写法达到的效果是一样的,可你的喜好啦
个人喜欢冒号方式,看起来更加优雅
End
送你小心心记得关注我哦!!
更多精彩内容
猛戳左边二维码
了解更多哦
以上是关于lua面向对象编程10分钟上手的主要内容,如果未能解决你的问题,请参考以下文章