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())
再次重申该篇文章只针对小白 所有解释都简化至最通俗易懂