print("*******元表********")
print("*******元表概念********")
--任何表变量都可以作为另一个表变量的元素
--任何表变量都可以有自己的元表
--当我们子表中进行一些特定操作时,会执行元表中的内容
print("*******设置元表********")
meta={
}
myTable={
}
--设置元表函数 (子表,元表)
setmetatable(myTable,meta)
print("*******特定操作********")
print("*******特定操作-_tostring********")
meta2={
--当子表要被当做字符串使用时 会默认调用这个元表中的tostring方法
__tostring=function ( t)
-- body
return t.name
end,
}
myTable2={
name="小明"
}
setmetatable(myTable2,meta2)
print(myTable2)
print("*******特定操作-_call********")
meta3={
--当子表要被当做字符串使用时 会默认调用这个元表中的tostring方法
__tostring=function ( t)
-- body
return t.name
end,
--作为函数使用时 调用call方法
__call = function(a,b)
print(a)
print(b)
print("小明23333")
end
}
myTable3={
name="小明"
}
setmetatable(myTable3,meta3)
myTable3() --必须有元表才能这样调用
myTable3(1) --要打印出这个1,call方法里要有两个参数,因为第一个参数默认是自己
print("*******特定操作-运算符重载********")
meta4={
--相当于运算符重载,当子表使用+运算符时 会掉用该方法
__add = function ( t1,t2 )
-- body
return t1.age+t2.age
end,
--运算符-
__sub = function ( t1,t2 )
-- body
return t1.age-t2.age
end,
--运算符*
__mul = function ( t1,t2 )
-- body
return t1.age*t2.age
end,
--运算符/
__div = function ( t1,t2 )
-- body
return t1.age/t2.age
end,
--运算符%
__mod = function ( t1,t2 )
-- body
return t1.age%t2.age
end,
--运算符^
__pow = function ( t1,t2 )
-- body
return t1.age^t2.age
end,
--运算符==
__eq = function ( t1,t2 )
-- body
return t1.age==t2.age
end,
--运算符<
__lt = function ( t1,t2 )
-- body
return t1.age<t2.age
end,
--运算符<=
__le = function ( t1,t2 )
-- body
return t1.age<=t2.age
end,
--运算符..
__concat = function ( t1,t2 )
-- body
return t1.age..t2.age
end,
}
myTable4={
age=1}
setmetatable(myTable4,meta4)
myTable5={
age=2}
setmetatable(myTable5,meta4)
print(myTable4+myTable5)
print(myTable4-myTable5)
print(myTable4*myTable5)
print(myTable4/myTable5)
print(myTable4^myTable5)
--如果要用条件运算符 来比较两个对象
--这两个对象的元素一定要一直 才能调用 即:有相同的元表
print(myTable4==myTable5)
--没有> 和>=
print(myTable4<myTable5)
print(myTable4<=myTable5)
print(myTable4..myTable5)
print("*******特定操作-_index和_newIndex********")
--重要
meta6={
--age=1
--方法三
--__index={age=2}
}
--__index最好还是在外面,不然可能会出问题
--方法一
--meta6.__index=meta6
--方法二
meta6.__index={
age=2}
myTable6={
}
setmetatable(myTable6,meta6)
--得到元表的方法
print(getmetatable(myTable6))
--__index
--当子表中找不到某一个属性时,会到元表中__index指定的表去找索引
print(myTable6.age) --没有meta6.__index=meta6的话会得到空,因为没有指定
--当使用rawget时,会去自己身上找有没有这个变量
print(rawget(myTable6,"age"))
--newIndex
--当赋值时 如果赋值一个不存在的索引 会把这个值赋值给newIndex所指向的表中 不会修改自己
meta7={
}
meta7.__newindex={
}
myTable7={
}
setmetatable(myTable7,meta7)
myTable7.age=1 --这个age被放到了新表中
print(myTable7.age)
--该方法会忽略newIndex直接给自身添加
rawset(myTable7,"age",2)
print(myTable7.age)
LUA-----元表
猜你喜欢
转载自blog.csdn.net/memory_MM_forever/article/details/113871082
今日推荐
周排行