• lua的模块与类


    模块

    在编写程序不可能将所有的代码都放置到一个文件,那会将写出的代码变得像老太太的裹脚布,又臭又长,而且在可阅读性上也很低,逻辑上也会混乱不堪。所以就有了模块,将同样功能或者相似功能的代码放在一个文件中,在需要使用时直接调用,而不用考虑其中的实现细节,使用起来就很方便了,而且整个代码逻辑也会清晰很多,这就是模块的作用。

    lua定义模块

    在以往lua定义方式是通过 module 来实现的,但是现在官方已经不提倡这种写法了,原因有两点:一、这种方式会破坏模块的高内聚;二、该方法会返回一个包含该模块的table,并还会定义一个全局变量,这会污染全局环境变量。推荐模块定义方法如下:

    test.lua

    -- 测试模块
    local _M = {_VERSION = "0.0.1", _NAME = "test", class_type = ""}
    
    -- 打印
    function _M.print(content)
    	print(content)
    end
    
    return _M
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    这里就定义了一个test模块,在table _M 中设置了版本_VERSION、名称 _NAME 和模块类型 class_type,模块中定义了一个函数 print() ,最后的return语句结束模块定义。

    加载调用模块

    lua模块可以使用内建函数 require() 来加载和缓存。

    test_load.lua

    -- 加载模块
    local test = require("test") 
    -- local test = require "test" -- 这样也是允许的
    
    test.print("hello world!")
    
    • 1
    • 2
    • 3
    • 4
    • 5

    这样就可以实现模块加载和调用了,注意这里的文件 test.lua 和文件 test_load.lua 是在同一目录路径下的,如果文件路径是 /src/util/test.lua/src/test_load.lua ,文件 test_load.lua 中加载 test 模块的语句就应该修改为 local test = require "util.test" ,这样方可有效,否则会报文件找不到的错误。

    定义类-面向对象编程

    当知道了如何定义模块后,就可以尝试引入面向对象编程思想来定义一个类了。以下代码就是尝试定义一个猫。

    local _M = {}
    
    -- 类的构造方法
    function _M.new(self,name,color)
        local o = {}
        setmetatable(o, self)
        self.__index = self
        
        -- 猫的名字
        self.name = name
        -- 猫的颜色
        self.color = color
        
        return o
    end
    
    -- 方法
    function _M.eat(self)
    	print("the cat " .. self.name .. "is eatting.")    
    end
    
    return _M
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    那么这里的 setmetatable() 函数, __index 都是什么,请参照lua的元表

  • 相关阅读:
    数据库管理-第111期 Oracle Exadata 02-硬件构成(20231017)
    Nacos源码 (7) Nacos与Spring
    swift类型属性及其注意点
    吴恩达deeplearning.ai:Tensorflow训练一个神经网络
    第6讲:SQL语句之DQL类型的数据查询语言
    阿里蚂蚁淘宝等多次一面面试面经
    【Linux】指令及权限管理的学习总结
    记一次 Linux 命令失效的憨批起因和解决方法
    Leetcode66. 加一
    合作式智能运输系统-车用通信系统应用层及应用数据交互标准 第一阶段2020
  • 原文地址:https://blog.csdn.net/yeah_you_are/article/details/126040703