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

news2025/1/14 0:48:35

本文目录

  • 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)/~、评论(▽)!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

nodejs 某音douyin网页端搜索接口及x_bogus、a_bogus(包含完整源码)(2024-06-13)

前言 x_bogus或a_bogus算法大概是对数据、ua、时间戳、浏览器的几个指纹进行计算,拿到一个110位大数组,然后转字符,在头部再添加十二位随机字符,再进行魔改的base64加密。 问:抖音的x_bogus、a_bogus值有什么用&#x…

幸狐RV1106开发板烧录Ubuntu系统与配置SDK,RV1106 LuckFox Pico Max——最新的操作

资料:上手教程 | LUCKFOX WIKI 以及SDK内的文档资料 开发板型号:RV1106 LuckFox Pico Max 烧录系统: Ubuntu 虚拟机系统:Ubuntu 20.04&&Ubuntu22.04 PC系统:win11 占用空间:大概15G 本文主要记…

idea有这个类却报红,无法用快捷键找到

idea有这个类却报红,无法用快捷键找到,但是项目启动却没有任何问题,严重影响到了开发效率,关idea 重新打开没有用。 找了一圈,办法如下: 1、点击左上角的 File—>Invalidate Caches/Restar 2、点击 In…

【Linux】进程控制3——进程程序替换

一,前言 创建子进程的目的之一就是为了代劳父进程执行父进程的部分代码,也就是说本质上来说父子进程都是执行的同一个代码段的数据,在子进程修改数据的时候进行写时拷贝修改数据段的部分数据。 但是还有一个目的——将子进程在运行时指向一个…

Python私教张大鹏 Vue3整合AntDesignVue之DatePicker 日期选择框

案例&#xff1a;选择日期 <script setup> import {ref} from "vue";const date ref(null) </script> <template><div class"p-8 bg-indigo-50 text-center"><a-date-picker v-model:value"date"/><a-divide…

visio绘制直线

1、右键打开绘图工具 2、选择线条 3、画直线、画横线

【推荐算法的评估与调试】离线评估+在线A/B Test

文章目录 1、离线评估1.1、评估排序算法1.1.1、AUC和GAUC1.1.2、NDCG 1.2、评估召回算法1.2.1、Precision&Recall1.2.2、MAP1.2.3、Hit Rate1.2.4、持续评估 2、在线评估2.1、线上&#xff1a;流量划分2.1.1、根据User ID划分流量2.1.2、分层重叠划分流量2.1.3、A/A实验的重…

最新下载:Paragon NTFS for Mac 15【软件附加安装教程】

NTFS For Mac 15是首个支持Mac上读写NTFS外置存储设备解决方案 &#xff0c;解决mac不能读写外置让您更加简单直观的在Mac机上随意对NTFS文件修改、删除等操作。 安 装 包 获 取 地 址&#xff1a; Paragon Ntfs For Mac 15版&#xff1a;​​https://souurl.cn/mqM9C6​​ 软…

python:faces swap

# encoding: utf-8 # 版权所有 2024 ©涂聚文有限公司 # 许可信息查看&#xff1a; 两个头像图片之间换脸 # 描述&#xff1a; https://stackoverflow.com/questions/902761/saving-a-numpy-array-as-an-image?answertabvotes # Author : geovindu,Geovin Du 涂聚文. #…

(几何:六边形面积)编写程序,提示用户输入六边形的边长,然后显示它的面积。

(几何:六边形面积)编写程序&#xff0c;提示用户输入六边形的边长&#xff0c;然后显示它的面积。计 算六边形面积的公式是: 这里的s就是边长。下面是一个运行示例 package myjava; import java.math.*; import java.util.Scanner; public class cy {public static void main(S…

数据结构笔记-2、线性表

2.1、线性表的定义和基本操作 如有侵权请联系删除。 2.1.1、线性表的定义&#xff1a; ​ 线性表是具有相同数据类型的 n (n>0) 个数据元素的有限序列&#xff0c;其中 n 为表长&#xff0c;当 n 0 时线性表是一个空表。若用 L 命名线性表&#xff0c;则其一般表示为&am…

STM32理论 —— μCOS-Ⅲ(2/2):时间管理、消息队列、信号量、任务内嵌信号量/队列、事件标志、软件定时器

文章目录 9. 时间管理9.1 OSTimeDly()9.2 OSTimeDlyHMSM()9.3 OSTimeDlyResume()9.4 延时函数实验 10. 消息队列10.1 创建消息队列函数OSQCreate()10.2 发送消息到消息队列函数(写入队列)OSQPost()10.3 获取消息队列中的消息函数(读出队列)OSQPend()10.4 消息队列操作实验 11. …

【因果推断python】32_合成控制2

目录 合成控制作为线性回归的一种实现​编辑 合成控制作为线性回归的一种实现 为了估计综合控制的治疗效果&#xff0c;我们将尝试构建一个类似于干预期之前的治疗单元的“假单元”。然后&#xff0c;我们将看到这个“假单位”在干预后的表现。合成控制和它所模仿的单位之间的…

Apollo配置中心最佳实践

携程配置中心地址&#xff1a;GitCode - 全球开发者的开源社区,开源代码托管平台 1.1 Apollo配置中心介绍 Apollo&#xff08;阿波罗&#xff09;是开源配置管理中心&#xff0c;能够集中化管理应用不同环境、不同集群的配置&#xff0c;配置修改后能够实时推送到应用端…

又一个对标Sora的AI视频工具,Dream Machine,开始免费试用

新的AI视频工具又又来了-Dream Machine&#xff0c;开始免费试用。 地址&#xff1a;https://lumalabs.ai/dream-machine 该工具需要科学上网 先看一下官网的宣传视频 luma AI 发布 Dream Machine 我生成了几个视频&#xff0c;效果还可以 生成视频很简单 只需要输入描述就可…

高等数学笔记(一):映射与函数

一、映射 1.1 映射的概念 存在一个法则 f &#xff0c;使得对 X 中每个元素 x &#xff0c;在 Y 中有唯一确定的元素 y 与之对应&#xff08;X、Y 非空集&#xff09; 称 f 为从 X 到 Y 的映射&#xff0c;如图所示 其中 y 称为元素 x&#xff08;在映射 f 下&#xff09;的…

高交会专题展—2024BTE第8届国际生物技术大会暨展览会

第二十六届中国国际高新技术成果交易会 THE 26th CHINA HI-TECH FAIR BTE第8届国际生物技术大会暨展览会 The 8th International Bio-technology Conference & Expo 2024年11月14-16日 深圳国际会展中心 展位预定&#xff1a;137交易会1016交易会3299 龚经理 组织机构…

企业商家如何精明选择软件开发公司

在当今信息化社会&#xff0c;企业的运营和发展已经离不开软件系统的支持。而选择一个合适的软件开发公司&#xff0c;则成为了企业商家在信息化道路上的一大挑战。那么&#xff0c;究竟如何挑选出既符合业务需求&#xff0c;又能保障项目成功的软件开发公司呢&#xff1f; 明…

【第5章】Vue之API风格

文章目录 前言一、选项式 API&#xff08;Options API&#xff09;1. 代码2. 效果 二、组合式 API&#xff08;Composition API&#xff09;1. 代码2. 效果 三、两者之间的区别总结 前言 Vue.js 提供了两种主要的 API 风格来组织组件的代码&#xff1a;选项式 API&#xff08;…