Lua中的metatable是什么?能否解释一下其作用和原理?
- 内容介绍
- 文章标签
- 相关推荐
本文共计833个文字,预计阅读时间需要4分钟。
Lua的metatable定义了大量的元方法,有些可以当作操作符重载来使用。例如,__add方法定义了当对一个table使用+操作符时的行为,但+操作符实际上是二元操作符,所以这里假设是Lua的metatable定义了。
Lua的metatable定义了大量的元方法,有些可以当作操作符重载来使用。例如,__add方法定义了对一个table使用+操作符时所发生的行为,但是,+操作符是二元操作符,假如只Lua的metatable定义了大量的元方法,有些可以当作操作符重载来使用。例如,__add方法定义了对一个table使用+操作符时所发生的行为,但是,+操作符是二元操作符,假如只有一个操作数定义了__add方法,这时候运算还会成立吗?我们可以尝试一下:
local u = {x = 1, y = 1}local v = {x = 2, y = 2}local mt = { __add = function(l, r) return {x = l.x + r.x, y = l.y + r.y} end }setmetatable(u, mt)local w = u + vprint(w.x, w.y)
运行发现并不会报错,而且得到了我们想要的结果。对于这类二元操作符,Lua只要检测到两个操作数中有一个定义了对应的元方法,就会去执行它,并不强制要求另外一个也要定义。
本文共计833个文字,预计阅读时间需要4分钟。
Lua的metatable定义了大量的元方法,有些可以当作操作符重载来使用。例如,__add方法定义了当对一个table使用+操作符时的行为,但+操作符实际上是二元操作符,所以这里假设是Lua的metatable定义了。
Lua的metatable定义了大量的元方法,有些可以当作操作符重载来使用。例如,__add方法定义了对一个table使用+操作符时所发生的行为,但是,+操作符是二元操作符,假如只Lua的metatable定义了大量的元方法,有些可以当作操作符重载来使用。例如,__add方法定义了对一个table使用+操作符时所发生的行为,但是,+操作符是二元操作符,假如只有一个操作数定义了__add方法,这时候运算还会成立吗?我们可以尝试一下:
local u = {x = 1, y = 1}local v = {x = 2, y = 2}local mt = { __add = function(l, r) return {x = l.x + r.x, y = l.y + r.y} end }setmetatable(u, mt)local w = u + vprint(w.x, w.y)
运行发现并不会报错,而且得到了我们想要的结果。对于这类二元操作符,Lua只要检测到两个操作数中有一个定义了对应的元方法,就会去执行它,并不强制要求另外一个也要定义。

