Lua实现自定义函数面向对象编程

本文目录

  • 1、引言
  • 2、原理
  • 3、实例
  • 4、层析验证


文章对应视频教程:

暂无,可以关注我的B站账号等待更新。


点击图片或链接访问我的B站主页~~~


1、引言

在现代软件开发中,面向对象编程(OOP)已经成为一种广泛使用的编程范式。通过OOP,我们能够创建更具模块化、可扩展性和可维护性的代码结构。然而,Lua作为一种轻量级、嵌入式的脚本语言,原生并不支持面向对象编程的诸多特性。在本博客中,我们将探索如何在Lua中实现面向对象编程。通过实际的代码示例和详细的解释,您将学会如何在Lua中创建类和对象、实现继承和封装等OOP概念,从而为您的Lua项目增添更强大的结构和功能。无论您是Lua的新手还是有经验的开发者,这篇文章都将为您提供宝贵的参考。


2、原理

Lua作为一种轻量级且灵活的脚本语言,虽然没有内置的面向对象编程(OOP)支持,但其强大的表(table)机制和元表(metatable)特性使得我们可以通过特定的编程模式来模拟OOP。Lua的表是一种非常灵活的数据结构,既可以用作数组,又可以用作字典,还可以用来表示对象。通过将函数和数据存储在表中,并使用元表来控制表的行为,我们可以创建类和对象的概念。

类与对象
在Lua中,类通常用一个表来表示,该表包含了类的属性和方法。每个对象则是另一个表,它以类表为其元表,从而继承类表中的方法。

-- 定义一个类
Account = {balance = 0}

-- 创建类的构造函数
function Account:new(o, balance)
    o = o or {}
    setmetatable(o, self)
    self.__index = self
    self.balance = balance or 0
    return o
end

-- 定义一个方法
function Account:deposit(amount)
    self.balance = self.balance + amount
end

-- 定义另一个方法
function Account:withdraw(amount)
    if amount > self.balance then
        error("Insufficient funds")
    else
        self.balance = self.balance - amount
    end
end

创建对象
通过类的构造函数,我们可以创建对象,并调用对象的方法。

-- 创建一个新对象
myAccount = Account:new(nil, 100)

-- 调用方法
myAccount:deposit(50)
print(myAccount.balance)  -- 输出:150

myAccount:withdraw(30)
print(myAccount.balance)  -- 输出:120

继承
在Lua中,继承是通过设置元表的__index字段来实现的。

-- 定义一个子类
SpecialAccount = Account:new()

-- 覆盖父类的方法
function SpecialAccount:withdraw(amount)
    if amount - self.balance >= self:getLimit() then
        error("Insufficient funds")
    else
        self.balance = self.balance - amount
    end
end

function SpecialAccount:getLimit()
    return self.limit or 0
end

-- 创建子类的对象
specialAccount = SpecialAccount:new(nil, 200)
specialAccount.limit = 50

-- 调用方法
specialAccount:withdraw(230)
print(specialAccount.balance)  -- 输出:-30

通过这些代码示例,我们可以看到,尽管Lua没有原生支持OOP,但通过灵活运用表和元表,我们可以有效地实现面向对象编程,为代码带来更高的可读性和可维护性。


3、实例

这部分面向对象的实例,只需要在lua代码中编写对应的代码(需要保留原本的c语言注册的lua函数),直接在func.lua中编写以下代码:

-- 元类
Shape = {}
Shape.__index = Shape

-- 基础类方法 new
function Shape:new ( )
    local o = {}
    setmetatable(o, self)
    o.id = create_rectangle()
    return o
end

function Shape:xy (x,y)
    set_xy(self.id,x,y);
end

function Shape:area ( )
    return get_area(self.id);
end

function Shape:perimeter ( )
    return get_perimeter(self.id);
end



-- 创建对象
myshape = Shape:new()

myshape:xy(6,9)
print("myshape :",myshape.id," area is",myshape:area(),"perimeter is",myshape:perimeter())

4、层析验证

在修改func.lua后,直接执行程序,结果如下:

在这里插入代码片
说明我们面向对象的编写实现成功,以后就可以采用面向对象的方法进行lua编程,提高编程效率。


时间流逝、年龄增长,是自己的磨炼、对知识技术的应用,还有那不变的一颗对嵌入式热爱的心!

到这里就结束了!希望大家给我的文章和B站视频
点赞o( ̄▽ ̄)d、关注(o)/~、评论(▽)!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

k8s+pv+pvc+nas 数据持久化volumes使用

1 k8s pod申请持久化卷配置 apiVersion: v1 kind: Service metadata:name: $IMG_NAMEnamespace: rz-dtlabels:app: $IMG_NAME spec:type: NodePortports:- port: 8091nodePort: 31082 #service对外开放端口selector:app: $IMG_NAME --- apiVersion: apps/v1 kind: Deployment …

HarmonyOs修改应用名称和图标方法

最近在开发Harmony应用,发现修改app.json5下的lable:app_name和icon不生效 后来经过查找,原来还需要更改entry下的src/main/module.json5才行,具体操作路径是: 更改后生效:

线程池前置知识

并发和并行 并发是指在单核CPU上,多个线程占用不同的CPU时间片。线程在物理上还是串行执行的,但是由于每个线程占用的CPU时间片非常短(比如10ms),看起来就像是多个线程都在共同执行一样,这样的场景称作并发…

架构设计 - nginx 的核心机制与主要应用场景

一、nginx 的核心机制: 1. 事件驱动模型(epoll 多路复用) 事件循环: Nginx的核心组件是一个事件循环,它不断地监听事件(如新连接的到来、请求数据的可读性等)。 当有事件发生时,事…

『 Linux 』动态库的加载

文章目录 动静态库的区别动态库-共享库动态库的加载动态库的管理 总结 动静态库的区别 动态库(Dynamic Libraries) 链接方式 动态链接,程序在运行时(而不是在编译时)与动态库链接; 操作系统负责加载动态库文件; 文件大小 使用动态库的应用程序通常其可执行文件大小更小; 因…

missing authentication credentials for REST request

1、报错截图 2、解决办法 将elasticsearch的elasticsearch.yml的 xpack.security.enabled: true 改为 xpack.security.enabled: false

vba学习系列(5)--指定区域指定字符串计数

系列文章目录 文章目录 系列文章目录前言一、需求背景二、vba自定义函数1.引入库 总结 前言 一、需求背景 想知道所有客诉项目里面什么项目最多,出现过多少次。 二、vba自定义函数 1.引入库 引用: CountCharInRange(区域,“字符串”) Function CountCh…

光伏电站阵列式冲击波声压光伏驱鸟器

光伏电站内鸟群的聚集可不是一件好事,鸟类排泄物,因其粘度大、具有腐蚀性的特点,一旦堆积在太阳能板上,会严重影响光伏电站的发电效率。长期积累的鸟粪不仅难以清洗,还可能引发组件的热斑效应,严重时甚至可…

Bean基础配置

黑马程序员SSM 文章目录 一、Bean基础配置二、bean别名配置2.1 ban的别名配置2.2 注意事项 三、Bean作用范围配置3.1 Bean作用范围3.2 bean作用范围说明 一、Bean基础配置 二、bean别名配置 2.1 ban的别名配置 2.2 注意事项 获取bean无论是通过id还是name获取,如果…

.NET MAUI Sqlite程序应用-数据库配置(一)

项目名称:Ownership(权籍信息采集) 一、安装 NuGet 包 安装 sqlite-net-pcl 安装 SQLitePCLRawEx.bundle_green 二、创建多个表及相关字段 Models\OwnershipItem.cs using SQLite;namespace Ownership.Models {public class fa_rural_base//基础数据…

ArcGIS Pro SDK (三)Addin控件 1 按钮类

ArcGIS Pro SDK (一)Addin控件 目录 ArcGIS Pro SDK (一)Addin控件1 Addin控件2 ArcGIS Pro 按钮2.1 添加控件2.2 Code 3 ArcGIS Pro 按钮面板3.1 添加控件3.2 Code 4 ArcGIS Pro 菜单4.1 添加控件4.2 Code 5 ArcGIS Pro 分割按钮…

如何从零训练多模态大模型(预训练方向)

节前,我们星球组织了一场算法岗技术&面试讨论会,邀请了一些互联网大厂朋友、参加社招和校招面试的同学. 针对算法岗技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备、面试常考点分享等热门话题进行了深入的讨论。 汇总合集&…

所爱隔山海,上海婚恋交友app开发,我奔向你

每每讲到婚恋,就有感叹“难”的声音,在婚恋市场上,到处充斥者“难”的声音,更有胜者,甚至发出了“难于上青天”的感叹。在婚恋市场蹉跎浮沉的青年俊女们,越挫越勇,向着爱的呼唤,一次…

Java工具-实现无损png转换jpg格式

目录 1、背景说明 2、通过代码实现格式转换 3、无损转化 4、说明 读取 PNG 图像: 创建空的 JPG 图像: 绘制 PNG 图像到 JPG 图像: 设置 JPG 图片压缩质量: 写入 JPG 文件并关闭流: 5、jpg转png 1、背景说明 …

Opencv图像梯度计算

Opencv图像梯度计算 Sobel算子 可以理解为是做边缘检测的一种方法。 首先说明自己对图像梯度的简单理解:简单理解就是图像的颜色发生变化的边界区域在X方向和Y方向上的梯度值 Gx Gy 而Gx和Gy处的梯度的计算—使用下面的公式来进行计算。 G x [ − 1 0 1 − 2 0 …

计算机网络(5) ARP协议

什么是ARP 地址解析协议,即ARP(Address Resolution Protocol),是根据IP地址获取物理地址的一个TCP/IP协议。主机发送信息时将包含目标IP地址的ARP请求广播到局域网络上的所有主机,并接收返回消息,以此确定…

【MySQL】mysql中常见的内置函数(日期、字符串、数学函数)

文章目录 案例表日期函数字符串函数数学函数其他函数 案例表 emp students 表 exam_result 表 日期函数 注意current_time和now的区别 案例一: 创建一张表用来记录生日,表结构如下 添加日期: insert tmp (birthday) values (2003-01-3…

香港CN2线路回国加速CDN介绍

随着互联网的迅猛发展,跨境数据传输的需求日益增加。尤其对于中国内地用户来说,访问海外网站和应用时,常常会面临网络延迟高、加载速度慢的问题。为了优化这一体验,香港 CN2 线路回国加速 CDN 成为了许多企业和个人的首选解决方案…

从Log4j和Fastjson RCE漏洞认识jndi注入

文章目录 前言JNDI注入基础介绍靶场搭建漏洞验证注入工具 log4j RCE漏洞分析漏洞靶场检测工具补丁绕过 Fastjson RCE漏洞分析漏洞靶场检测工具补丁绕过 总结 前言 接着前文的学习《Java反序列化漏洞与URLDNS利用链分析》,想了解为什么 Fastjson 反序列化漏洞的利用…

Java中的方法重写与重载

在Java编程语言中,方法重写(Override)和方法重载(Overload)是实现代码多态性的两种基本方式。它们允许程序员以多种方式使用相同的方法名,增加了程序的可读性和可重用性,但它们的应用场景和规则…