Lua - 在元表中只调用一个运算符
Posted
技术标签:
【中文标题】Lua - 在元表中只调用一个运算符【英文标题】:Lua - calls only one operator in metatable 【发布时间】:2013-11-19 15:55:50 【问题描述】:我是 Lua 新手,所以可能错过了一些教程,但问题是:
我有原始表和元表以及我正在应用的几个运算符:
original = 1, 2, 3
test = setmetatable(original,
__add = function (lhs, rhs)
print('adds')
end,
__mul = function (lhs, rhs)
print('multiplies')
end
)
不幸的是,当我正在执行以下操作时:
test = test + 3
test = test * 3
我收到一个错误:
attempt to perform arithmetic on global 'test' (a table value)
没有找到关于这个问题的任何描述。我也注意到如果 metatable 是一个单独的变量并传递给setmetatable
方法,那么它可以工作..
【问题讨论】:
您的代码示例对我有用。有什么你不包括的吗?您的错误中的全局multiplies
是什么?
抱歉,打错了,全局是test
当然,我用的是Lua 5.1
是的,它现在在一个单独的文件中也对我有用,似乎是我的错..
我用正确的值更新了我的问题
【参考方案1】:
test = test + 3
大致相当于:
test = getmetatable(test).__add(test, 3)
您将__add
的返回值分配给test
。
_add
什么都不返回,所以在第一行之后,test
是nil
。然后你再做一次:
test = getmetatable(test).__add(test, 3)
您无法索引或获取nil
的元表。
很容易发现这一点,可能是我会尝试的第一件事:
test = test + 3
print(test)
test = test * 3
【讨论】:
【参考方案2】:我得到的错误是
尝试对全局“测试”(零值)执行算术
这意味着test
在最后一行中为零。你需要在__add
返回一些东西。
【讨论】:
这个错误比原始消息更有意义,这表明表test
没有正确的算术元方法。以上是关于Lua - 在元表中只调用一个运算符的主要内容,如果未能解决你的问题,请参考以下文章