lua面向对象编程10分钟上手

Posted 中企老徐的架构笔记

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了lua面向对象编程10分钟上手相关的知识,希望对你有一定的参考价值。


目录

① 元表和元方法

② 元方法 __index 

一个最简单的lua类

④ 点与冒号



1 元表和元方法

lua 里面有一种数据类型叫table

table可以说是最灵活的数据类型了

  1. 可以做数组

  2. 可以做map

  3. 甚至可以把json串直接转成table


table表的定义如下

--定义数组 t1[1] = a , t1[2] = btable t1 = {"a","b"}  table t2 = {"c","d"}
 -- 数组与map混合 t3[1] = e t3["age"] = 18 table t3 = {"e","f", username="xly", age = 18

说了这么多,那什么是元表呢?

元表其实也是一个table,只是我们强制把它设置为另一个table的元表

是不是听起来有点绕呢,我们来看一个例子来了解下

-- 定义一个tabletable t1 = {}-- 定义一个table ,此时t1 mt都是一样tabletable mt = {}--调用setmetatable,把mt设置为t1的元表,--是不是很暴力,一条命令就让mt当了t1的小弟(元表)setmetatable(t1, mt) 

此时的mt元表就有了一点点面向对象的味道了,因为它有元方法啊

你知道的,只有类这种东西才能有方法嘛


那什么又是元方法呢?

听名字就知道元方法出自元表啦

其实就是元表隐含的一些方法,有很多 都是以 ‘__’ 开头的,而且这些方法都可以重载的,就像c++里面重载运算符一样

lua面向对象编程10分钟上手


这些元表里面最重要的一个就是 __index 了


2 元方法 __index

lua面向对象编程10分钟上手

敲黑板:

lua面向对象编程10分钟上手
lua面向对象编程10分钟上手

特别注意

lua面向对象编程10分钟上手

__index 可以指向一个函数,也可以指向一个table;这下牛逼大了 因为table可以自定义function,而这也是lua面向对象编程的根基



我们看一段代码来说明 __index的用法

-- 定义一个tablelocal t1 = {}
-- 定义一个table 并重载了它的__index方法local mt = {__index = t1}
-- 如下代码 便是定义了一个类 myClasslocal myClass = {}setmetatable(myClass, mt)-- 调用getName() 方法 , 肯定报错啦 我们j就没定义过这个方法嘛myClass.getName()

我们试着解释下上面的代码

myClass调用getName 的查找过程是这样的

  1. myClass查看自己有没有定义getName()函数

  2. 如果没有查看元表mt的__index字段

  3. __index字段查询table t1有没有定义getName()函数

  4. 如果t1定义了getName()就调用,否则报错


现在明白报错原因了,t1没定义getName()方法嘛

在t1声明后加上就ok啦  如下代码

-- 定义一个tablelocal t1 = {}tl.getName = function return "xly" end
.......-- 这样调用就不报错啦myClass.getName()


有了上面的基础 我们写一个最简单类吧


3 一个最简单的lua类

lua面向对象编程10分钟上手

user.lua

_M = {}_mt = {__index = _M}
function _M.getName(self) return self.nameend
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'


点与冒号

lua面向对象编程10分钟上手

其实这是个语法糖

但一不小心写错了,可能要调试好久

所以建议大家固定一种方式


上面的代码可以换成‘.’的调用方式  如下代码

local name = u:getName() --冒号写法,隐式传参local name = u.getName(u) -- 点号写法 显示传参

两种写法达到的效果是一样的,可你的喜好啦

个人喜欢冒号方式,看起来更加优雅



lua面向对象编程10分钟上手



lua面向对象编程10分钟上手

End




lua面向对象编程10分钟上手

送你小心心记得关注我哦!!

lua面向对象编程10分钟上手

lua面向对象编程10分钟上手

更多精彩内容

猛戳左边二维码

了解更多哦





以上是关于lua面向对象编程10分钟上手的主要内容,如果未能解决你的问题,请参考以下文章

(转载)笨木头Lua专栏基础补充20:面向对象——类和继承

VSCode自定义代码片段——JS中的面向对象编程

VSCode自定义代码片段9——JS中的面向对象编程

简单说说如何上手面向对象编程?

Lua 15分钟快速上手(上)

Lua面向对象编程