最易懂的方式介绍lua的面向对象编程

lua语言本身是面向过程编程的一门语言 但其实也是可以做面向对象编程的

这几个月都在写Java 等回来写lua后发现写的很不习惯 这里面向对象不懂的朋友可以去搜一下

1.简单介绍lua的面向对象

lua面向对象是基于表(数组)的你可以按照面向对象的思路将你想要的任意一个表当作一个对象 

例如以下:

user={
    name="白",--成员变量
    age=18,--成员变量

    toString=function()--成员方法
        return "user("..user.name..","..user.age..")"
    end

    user:tostring=function()--成员方法
        return "user("..self.name..","..self.age..")"
    end
}
Temp={
    Var={name="白",age=18},

    Var:show=function()
        return self
    end
}

2.lua成员方法的理解

在上面我们看到了两种成员方法的定义格式

一种是 方法名称=function() -- toString=function()

另一种是 表名称:方法名称=function() -- user:tostring=function()

那么这两种方式定义的成员方法有什么区别呢

首先是第一种

这种方式所定义的方法在调用该对象的成员变量时需使用 对象名.变量名 来调用

也就是user.name user.age

而在调用方法时 以:表名称.方法名() 调用即可 在这里也就是 user.toString()

这是我们最直观就可以看到的也是两种不同方式定义最明显的区别

第二种

这种方式所定义的方法在调用成员变量时与上者不同

例如上面的代码 第二段 Temp表

我们最直观的就是可以看到调用时需要使用self来调用 那么self是什么呢?

可以理解为self是指向Var表的一个指针(这里只是可以这样理解 是让不懂的小白更快理解的一个介绍) 而Var这个表是在方法名前面定义的 也就是Var:方法名=function() 众所周知方法名是可以随便定义的 只要遵守lua变量定义规范 也就是说前面的Var就是你self所指向的表

如果小白这里不懂 可以把这里的self看作定义方法时Var所在位置的表 也就是self=Var (请注意如果不是实在不懂建议看看其他作者的文章)

在调用方法时 以:表名称.指向的表名称;方法名() 在这里也就是 Temp.Var:show()

3.lua面向对象实战

这里给大家分享一个lua数组实现数组转json数组的代码

书写思路来源与Java中的Map对象

-- JsonMap.lua File

function newMap(...)
    local ran = (function(number)
        local str = ""
        for i = 1, number do
            str = str .. string.format("%X", math.random(11, 16))
        end
        return str
    end)(4)
    local var = "var" .. ran
    local varUesrData = "uesrData" .. ran
    load(var .. [[ = {
        ]] .. varUesrData .. [[ = {}
    }]], "t")()
    local putVarUesrData = load("return " .. var .. "." .. varUesrData)()
    local data = {
        put = function(k, v)
            local uesrNumber = 0
            if (not putVarUesrData) then
                putVarUesrData = {}
            else
                uesrNumber = #putVarUesrData
            end
            if (type(v) == "string") then
                putVarUesrData[k] = '"' .. v .. '"'
            elseif (type(v) == "number" or type(v) == "boolean") then
                putVarUesrData[k] = v
            elseif (type(v) == "table") then
                if (v.put and v.get and v.toJsonString) then
                    putVarUesrData[k] = v.toJsonString()
                else
                    (function()
                        local str = "["
                        for key, value in pairs(v) do
                            for K, V in pairs(value) do
                                str = str .. V.toJsonString() .. ","
                            end
                        end
                        str = str:sub(1, #str - 1) .. "]"
                        putVarUesrData[k] = str
                    end)()
                end
            else
                error("请输入合法的数据类型")
            end
        end,
        get = function(k)
            if (putVarUesrData and putVarUesrData[k]) then
                return putVarUesrData[k]
            else
                error("找不到key")
            end
        end,
        toJsonString = function()
            if (putVarUesrData) then
                local jsonStringData, str = "{", ""
                for key, value in pairs(putVarUesrData) do
                    local v=value
                    if (type(value)=="boolean") then
                        v=tostring(value)
                    end
                    str = '"'.. key .. '":' .. v .. ","
                    jsonStringData = jsonStringData .. str
                    str = ""
                end
                jsonStringData = jsonStringData:sub(1, #jsonStringData - 1) .. "}"
                return jsonStringData
            end
        end
    }
    local map = {
        put = data.put,
        get = data.get,
        toJsonString = data.toJsonString
    }
    -- Java构造函数模拟
    if (#{ ... } == 2) then
        KEY, VALUE = ...
        map.put(KEY, VALUE)
    elseif (#{ ... } == 1) then
        error("请至少给两个参数")
    end
    return map
end

LuaMap = newMap()-- 创建Map对象
LuaMap.put("bai", newMap("黑", "HEI")) -- key:bai value:{"黑","HEI"}
LuaMap.put("白", 19)-- key:白 value:19
LuaMap.put("demo", true)-- key:demo value:true
LuaMap.put("white","白")-- key:white value:"白" 注意有引号(不干扰json数组)!!!
print(LuaMap.get("bai"))
print(LuaMap.get("白"))
print(LuaMap.get("demo"))
print(LuaMap.get("white"))
print(LuaMap.toJsonString())

再次重申该篇文章只针对小白 所有解释都简化至最通俗易懂

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值