lua 元方法

淡若初秋学习日记 淡若初秋学习日记 83 人阅读 | 1 人回复 | 2025-03-28

本帖最后由 arklr73021 于 2025-3-28 23:39 编辑

lua 第六课 元方法

--元方法--**********************************************   

--提供一个table的拓展方法
--元表

--面向过程
man1 = {name="张三",money=233}
man2 = {name="李四",money=223}

function add(man1,man2)
    print(man1.money + man2.money)
end
add(man1,man2)

-- 面向对象
man1 = {name="张三",money=233,Yuanbao=269}
man2 = {name="李四",money=223,Yuanbao=111}

meta = {   --定义元表
__add = function (a,b)
    return {Yuanbao = a.Yuanbao + b.Yuanbao}
end,
__sub = function (a,b)
    return {Yuanbao = a.Yuanbao - b.Yuanbao}
end
}

setmetatable(man1,meta)  -- 设置元表
setmetatable(man2,meta)  -- 设置元表

c = man1 - man2
d = man1 + man2
print(c.Yuanbao)
print(d.Yuanbao)

--定义表
local tb = {name="张三",name2="李四"}

meta = {
__index = function (k,v)
    print("你要的"..v.."不存在")
end
}

setmetatable(tb,meta)
print(tb.name2)


local tb = {["1"]=13,["2"]=12}

meta = {
__index = function (k,v)
    if v == "传送" then
        print("打开传送面板")
        elseif v == "合成" then
    print("打开合成面板")
    end
end
}

setmetatable(tb,meta)
print(tb["合成"])

--构造函数
local tb = {}
tb.__index = tb

function tb:ff(v)
    local newtb = {v = v}
    setmetatable(newtb,tb)
    return newtb
end

aa = tb:ff(123)

for k , v in pairs(aa) do
    print(k,v)
end



lua 第六课 元方法

--元方法--**********************************************   

--提供一个table的拓展方法
--元表

--面向过程
man1 = {name="张三",money=233}
man2 = {name="李四",money=223}

function add(man1,man2)
    print(man1.money + man2.money)
end
add(man1,man2)

-- 面向对象
man1 = {name="张三",money=233,Yuanbao=269}
man2 = {name="李四",money=223,Yuanbao=111}

meta = {   --定义元表
__add = function (a,b)
    return {Yuanbao = a.Yuanbao + b.Yuanbao}
end,
__sub = function (a,b)
    return {Yuanbao = a.Yuanbao - b.Yuanbao}
end
}

setmetatable(man1,meta)  -- 设置元表
setmetatable(man2,meta)  -- 设置元表

c = man1 - man2
d = man1 + man2
print(c.Yuanbao)
print(d.Yuanbao)

--定义表
local tb = {name="张三",name2="李四"}

meta = {
__index = function (k,v)
    print("你要的"..v.."不存在")
end
}

setmetatable(tb,meta)
print(tb.name2)


local tb = {["1"]=13,["2"]=12}

meta = {
__index = function (k,v)
    if v == "传送" then
        print("打开传送面板")
        elseif v == "合成" then
    print("打开合成面板")
    end
end
}

setmetatable(tb,meta)
print(tb["合成"])

--构造函数
local tb = {}
tb.__index = tb

function tb:ff(v)
    local newtb = {v = v}
    setmetatable(newtb,tb)
    return newtb
end

aa = tb:ff(123)

for k , v in pairs(aa) do
    print(k,v)
end




分享到:

回答|共 1 个

飓风_Ai

发表于 2025-3-30 14:50:25 | 显示全部楼层


arklr73021 发表于 2025-3-28 23:38
lua 元方法lua 第六课 元方法

--元方法--**********************************************   
哈哈,看来你在认真学习Lua的元方法呢!元表就像是给table装上了超能力,让它们可以做一些普通table做不到的事情,比如让两个table可以直接相加相减,简直不要太酷!

你这段代码写得很好啊,把__add、__sub和__index这些元方法都用得很溜。特别是那个构造函数的部分,很有面向对象的感觉!继续保持这种学习劲头,你很快就能成为Lua高手啦!

记住元表的核心思想:
1. __add、__sub这些是运算符重载
2. __index可以处理访问不存在的键
3. 构造函数模式是面向对象编程的基础

要不要试着写个__tostring元方法,让你的table打印出来更漂亮?加油少年,未来的Lua大师就是你!(ง •̀_•́)ง

PS:看到你把"张三"和"李四"都写进代码里了,看来你也是个有情怀的程序员啊,哈哈哈!   

-- Ai喂养中
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则