Lua流水账3:如何理解Metatables与Metamethods的运用?

2026-06-05 06:113阅读0评论SEO基础
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计2328个文字,预计阅读时间需要10分钟。

Lua流水账3:如何理解Metatables与Metamethods的运用?

Metatables 允许我们改变 table 的行为,任何一个表都可以是另一个表的 metatable,一组相关的表可以共享同一个 metatable(描述它们共同的行为)。一个表也可以有自己的 metatable(描述其私有行为)。

Metatables允许我们改变table的行为,任何一个表都可以是其他一个表的metatable,一组相关的表可以共享一个metatable(描述他们共同的行为)。一个表也可以是自身的metatable(描述其私有行为)

1.getmetatable(t):获取t的metatable,setmetatable(t,tmetatable):设置t的metatable为tmetatable

t = {}; print(getmetatable(t)); t1 = {}; setmetatable(t,t1); if getmetatable(t) == t1 then print("t's metatable is t1"); end

2.对于每一个算术运算符,metatable都有对应的域名与其对应,如__add(加),__mul(乘),__sub(减),__div(除),__unm(负),__pow(幂),我们也可以定义concat定义连接行为。对于所有参数,Lua选择metamethod的原则:如果第一个参数存在带有对应域名(如__add)的metatable,Lua使用它作为metatable,和第二参数无关。否则第二个参数存在带有对应域名(如__add)的metatable,Lua使用它作为metamethod,否则报错。

阅读全文

本文共计2328个文字,预计阅读时间需要10分钟。

Lua流水账3:如何理解Metatables与Metamethods的运用?

Metatables 允许我们改变 table 的行为,任何一个表都可以是另一个表的 metatable,一组相关的表可以共享同一个 metatable(描述它们共同的行为)。一个表也可以有自己的 metatable(描述其私有行为)。

Metatables允许我们改变table的行为,任何一个表都可以是其他一个表的metatable,一组相关的表可以共享一个metatable(描述他们共同的行为)。一个表也可以是自身的metatable(描述其私有行为)

1.getmetatable(t):获取t的metatable,setmetatable(t,tmetatable):设置t的metatable为tmetatable

t = {}; print(getmetatable(t)); t1 = {}; setmetatable(t,t1); if getmetatable(t) == t1 then print("t's metatable is t1"); end

2.对于每一个算术运算符,metatable都有对应的域名与其对应,如__add(加),__mul(乘),__sub(减),__div(除),__unm(负),__pow(幂),我们也可以定义concat定义连接行为。对于所有参数,Lua选择metamethod的原则:如果第一个参数存在带有对应域名(如__add)的metatable,Lua使用它作为metatable,和第二参数无关。否则第二个参数存在带有对应域名(如__add)的metatable,Lua使用它作为metamethod,否则报错。

阅读全文