lua学习笔记---面向对象

在 Lua 中,封装主要通过元表(metatable)来实现。元表可以定义 __index__newindex__call 等元方法来控制对表的访问和赋值行为。

  • __index 元方法:当尝试访问一个不存在的键时,Lua 会查找元表的 __index 字段。如果 __index 是一个表,Lua 会在该表中查找键。这允许我们定义一个“类”的属性和方法,然后让所有实例共享这些属性和方法,从而实现封装。

  • __newindex 元方法:当尝试给一个不存在的键赋值时,Lua 会查找元表的 __newindex 字段。这可以用来控制对属性的赋值行为,例如,可以在这里添加日志记录或者验证逻辑。

在 Lua 中,继承是通过元表的 __index 元方法实现的。当你尝试访问一个表的属性或方法时,如果该表没有这个属性或方法,Lua 会查看该表的元表的 __index 字段。如果 __index 是另一个表,Lua 会在那个表中查找属性或方法,这个过程会一直进行,直到找到属性或方法,或者 __indexnil

print("--------面向对象----------------")
print("------------------封装-----------------")
Object={}--定义了一个名为 Object 的空表,它将作为我们的“类”
function Object:Test()--定义了一个名为 Test 的方法,它属于 Object 类。在 Lua 中,冒号 : 用于表示方法,它实际上是语法糖,等同于 Object.Test(self)-- bodyprint(self.id)
end
Object.id=1
function Object:new()--[[new 函数是一个构造函数,用于创建 Object 类的新实例。这里创建了一个空表 obj,并设置其元表的 __index 为 self(即 Object),这样 obj 就可以访问 Object 中定义的属性和方法。最后返回这个新对象。]]local obj={}self.__index=selfsetmetatable(obj,self)return obj
end
local myObj = Object:new()--这里通过调用 Object:new() 创建了一个 Object 类的新实例 myObj
print(myObj.id)--这里打印 myObj 的 id 属性,并调用其 Test 方法 由于 id 是从 Object 继承来的,所以打印的是 1
myObj:Test()
myObj.id=2--对空表中声明一个新的属性
print(Object.id)
myObj:Test()
print("------------------继承-----------------")
--写一个用于继承的方法
function Object:subClass( className )--_G是总表 所有声明的全局变量都以键值对的形式存在其中_G[className]={}--写相关继承的规则local obj = _G[className]self.__index=selfobj.base=self--定义一个base属性,代表父类setmetatable(obj,self)
end
Object:subClass("Person")
print(Person.id) 
local p = Person:new()
print(p.id)
print("------------------多态-----------------")
--相同行为不同表现
Object:subClass("GameObject")
GameObject.posX=0
GameObject.posY=0
function GameObject:Move()self.posX=self.posX+1self.posY=self.posY+1print(self.posX)print(self.posY)
end
GameObject:subClass("Player")
local p1 = Player:new()
function Player:Move()self.base.Move(self)
end
p1:Move()
local p2 = Player:new()
p2:Move()
p1:Move()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/463703.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

<项目代码>YOLOv8 夜间车辆识别<目标检测>

YOLOv8是一种单阶段(one-stage)检测算法,它将目标检测问题转化为一个回归问题,能够在一次前向传播过程中同时完成目标的分类和定位任务。相较于两阶段检测算法(如Faster R-CNN),YOLOv8具有更高的…

MATLAB实现蝙蝠算法(BA)

MATLAB实现蝙蝠算法(BA) 1.算法介绍 蝙蝠算法(简称BA)是一种受微型蝙蝠回声定位机制启发的群体智能算法,由Xin-She Yang于2010年提出。这种算法模拟了微型蝙蝠通过向周围环境发出声音并监听回声来识别猎物、避开障碍物以及追踪巢穴的行为。…

【温酒笔记】UART

参考文档&#xff1a;野火STM32F103 1. 物理层 STM32见下图 1、TTL电平标准&#xff1a; 输出L&#xff1a;<0.8V&#xff1b;H:>2.4V。 输入L&#xff1a;<1.2V&#xff1b;H:>2.0V。 2、CMOS电平标准&#xff1a; 输出L&#xff1a;<0.1Vcc&#xff1b;…

Chromium127编译指南 Mac篇(一)- 环境准备详解

概述 在开源浏览器生态系统中&#xff0c;Chromium始终扮演着举足轻重的角色。作为Google Chrome的技术基石&#xff0c;它不仅支撑着全球最受欢迎的浏览器之一&#xff0c;更为众多定制化浏览器项目提供了坚实的基础。对于渴望探索浏览器技术深度&#xff0c;或计划开发自有浏…

【spark的集群模式搭建】spark集群之Yarn集群模式搭建(清晰明了的搭建流程)

文章目录 1、使用Anaconda部署Python2、上传、解压、重命名3、创建软连接&#xff08;如果在Standalone模式中创建有就删除&#xff09;4、配置spark环境变量5、修改spark-env.sh配置文件6、修改spark-defaults.conf 配置文件7、修改log4j.properties配置文件8、上传spark jar包…

h2 数据库命令行工具用法汇总

背景 h2 数据是个短小精悍的嵌入式数据库&#xff0c;纯 Java 实现&#xff0c;且非常小。 我们有一个比较底层的应用中就是用了 h2 数据库来存储应用的基础信息&#xff0c;这个数据库说起来比较容易。 本文总结实际项目中涉及到的 h2 的相关技术及问题。 控制台工具用法 …

再探“构造函数”(2)友元and内部类

文章目录 一. 友元‘全局函数’作友元‘成员函数’作友元‘类‘作友元 内部类 一. 友元 何时会用到友元呢&#xff1f; 当想让&#xff08;类外面的某个函数/其它的类&#xff09;访问 某个类里面的(私有或保护的)内容时&#xff0c;可以选择使用友元。 友元提供了一种突破&a…

告别枯燥数据!20种色彩缤纷的数据可视化图表任你选,轻松应对各种场景

我们每天都在和各种数据打交道&#xff0c;单纯的一串串数字&#xff0c;看着就头疼。如果数据不再是枯燥的表格&#xff0c;而是变成了色彩鲜艳的柱状图、线条流畅的折线图&#xff0c;或者是直观易懂的饼图&#xff0c;让用户一眼Get到重点&#xff0c;让老板为你的汇报方案鼓…

C++和OpenGL实现3D游戏编程【连载17】——着色器进阶(附源码)

🔥C++和OpenGL实现3D游戏编程【目录】 1、本节要实现的内容 在前面着色器初步一节我们了解了着色器的一些初步知识,通过顶点着色器和片段着色器显示出了一个彩色的立方体。我们这节课就来了解一些在着色器中显示纹理等一系列实用操作,同时了解一些进阶的图像渲染技术,比如…

散热器为什么要加风扇:【图文讲解】

前面我们聊到了TEC散热器中&#xff0c;TEC的工作原理&#xff0c;也大概聊了一下热的整个传递过程。TEC散热器在工作的时候&#xff0c;会产生冷热两个端面&#xff0c;核心工作原理是通电后TEC把冷端的热量搬移到热端。这样把TEC散热器的冷端放置在需要散热的器件表面&#x…

HO-XGBoost河马算法优化极限梯度提升树多变量回归预测(Matlab)

HO-XGBoost河马算法优化极限梯度提升树多变量回归预测&#xff08;Matlab&#xff09; 目录 HO-XGBoost河马算法优化极限梯度提升树多变量回归预测&#xff08;Matlab&#xff09;预测效果基本介绍程序设计参考资料 预测效果 基本介绍 Matlab实现HO-XGBoost多变量回归预测&…

Zookeeper 简介 | 特点 | 数据存储

1、简介 zk就是一个分布式文件系统&#xff0c;不过存储数据的量极小。 1. zookeeper是一个为分布式应用程序提供的一个分布式开源协调服务框架。是Google的Chubby的一个开源实现&#xff0c;是Hadoop和Hbase的重要组件。主要用于解决分布式集群中应用系统的一致性问题。 2. 提…

[5] 一篇文章教会你如何实现端口敲门

文章目录 1. 描述2. 基本原理3. 优点4. 缺点5. 实现过程6. firewall-cmd命令介绍7. 写到最后 1. 描述 端口敲门技术(Prot Knocking)技术&#xff0c;用于通过一系列预定的端口来动态地打开防火墙或访问特定服务甚至执行一小段任务&#xff0c;用于增强系统地安全性&#xff0c;…

TensorRT-LLM的k8s弹性伸缩部署方案

Scaling LLMs with NVIDIA Triton and NVIDIA TensorRT-LLM Using Kubernetes | NVIDIA Technical Blog 一共涉及4个k8s组件&#xff1a; 1. Deployment&#xff1a;跑起来N个pod&#xff1b;指定NVIDIA官方的triton&trt-llm的docker image&#xff0c;指定好model放在哪个…

Chainlit集成LlamaIndex实现知识库高级检索(HyDE查询重写转换)

检索原理 HyDEQueryTransform 是一种用于信息检索系统中的查询转换技术&#xff0c;它基于假设文档嵌入&#xff08;Hypothetical Document Embeddings&#xff0c;简称HyDE&#xff09;的概念&#xff0c;旨在通过生成假设文档来改善查询与文档之间的语义对齐&#xff0c;进而…

使用Markdown编写适用于GitHub的README.md文件的目录结构

文章目录 [toc] 顶部1. 使用[TOC]自动生成2. VSCode中的插件3. 手搓目录目录相关资料本文相关代码一、概述1.1 基本概念1.2 两种处理模型&#xff08;1&#xff09;微批处理&#xff08;2&#xff09;持续处理 1.3 Structured Streaming和Spark SQL、Spark Streaming关系 二、编…

[ shell 脚本实战篇 ] 编写恶意程序实现需求(恶意程序A监测特定目录B出现特定文件C执行恶意操作D-windows)

&#x1f36c; 博主介绍 &#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 _PowerShell &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 &#x1f389;点赞➕评论➕收藏 养成习…

攻克数字工具(GKData)在推动 AI 发展中的关键作用

摘要&#xff1a;本文深入探讨了攻克数字工具&#xff08;GKData&#xff09;对人工智能&#xff08;AI&#xff09;发展的重要推动作用&#xff0c;同时阐述了人工智能技术的发展历程、现状、应用领域和前景。分析了 GKData 在数据处理、模型训练与优化、算法创新等方面为 AI …

Golang文件操作

1.文件介绍&#xff1a;文件是数据源&#xff0c;主要作用是保存数据 2.文件在程序中是以流的形式来操作的 对文件的操作主要用File(os包)结构体来实现 文件的基本操作 1&#xff09;打开一个文件进行读操作&#xff1a; os.Open(name string)(*File,error) 2&#xff09;关…

WebSocket的理解与应用

WebSocket的理解与应用 一、是什么二、特点1、全双工2、二进制帧3、协议名4、握手5、优点 三、应用场景 一、是什么 WebSocket&#xff0c;是一种网络传输协议&#xff0c;位于OSI模型的应用层。可在单个TCP连接上进行全双工通信&#xff0c;能更好的节省服务器资源和带宽并达…