lua元表

元表 (metatable) 的表现行为类似于C++语言中的操作符重载
setmetatable(table,metatable):此方法用于为一个表设置元表。
getmetatable(table):此方法用于获取表的元表对象。


local function add_fun(self,another)
local result = {}
local size = #self
for i=1,size do
result[i] = self[i]+another[i]
end
return result
end

local function tostring_fun(self)
local str = ""
for i in pairs(self)do
str = str..(self[i]).." "
end
return str
end

local mytable1 = {1,2,3}
local mytable2 = {4,5,6}
setmetatable(mytable1, {__add = add_fun})
local mytable3 = mytable1+mytable2
setmetatable(mytable3, {__tostring = tostring_fun})
print(mytable3)
--假如我们想保护我们的对象使其使用者既看不到也不能修改 metatables。我们可以对 metatable 设置了__metatable 的值
setmetatable(mytable3,__metatable)
print(mytable3)


5 7 9
table: 0x64f5f728


再来一段吧:

print("Lua在创建新的table时不会创建元表:")
local t1={1,2,3}
print(getmetatable(t1))
local t2 = {}
setmetatable(t1,t2)
print(getmetatable(t1))

print("重载加号运算符:")
t1=setmetatable(t1,{
__add = function(mytable,newtable)
local sum = 0
for k,v in pairs(mytable)do
sum = sum+v
end
for k,v in pairs(newtable)do
sum = sum+v
end
mytable["sum"] = sum
return mytable
end
}
)

local t3 = {4,5,6}
local t4 = t1+t3
print(t4.sum)

print("重载减号运算符:")
local mt = {}
mt.__sub=function(table1,table2)
return table1["value"] - table2["value"]
end

--类似仿函数
mt.__call=function(f,...)
print("类似仿函数:",...)
end

local tt1 = {value=1}
local tt3 = {value=3}
setmetatable(tt3,mt)
print(tt3-tt1)
print(tt3(6,"a"))

local operator_str = [[
_add 对应的运算符 '+'.
__sub 对应的运算符 '-'.
__mul 对应的运算符 '*'.
__div 对应的运算符 '/'.
__mod 对应的运算符 '%'.
__unm 对应的运算符 '-'.
__concat 对应的运算符 '..'.
__eq 对应的运算符 '=='.
__lt 对应的运算符 '<'.
__le 对应的运算符 '<='.
]]

Lua在创建新的table时不会创建元表:
nil
table: 0x67a6f240
重载加号运算符:
21
重载减号运算符:
2
类似仿函数: 6 a


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值