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 什么都不返回,所以在第一行之后,testnil。然后你再做一次:

test = getmetatable(test).__add(test, 3)

您无法索引或获取nil 的元表。


很容易发现这一点,可能是我会尝试的第一件事:

test = test + 3
print(test)
test = test * 3

【讨论】:

【参考方案2】:

我得到的错误是

尝试对全局“测试”(零值)执行算术

这意味着test 在最后一行中为零。你需要在__add返回一些东西。

【讨论】:

这个错误比原始消息更有意义,这表明表 test 没有正确的算术元方法。

以上是关于Lua - 在元表中只调用一个运算符的主要内容,如果未能解决你的问题,请参考以下文章

lua元表(metatable)

如何在 Lua 函数上应用元表以启用它们之间的自定义运算符?

Lua——3.元表Metatable

Lua学习笔记-metatable元表

lua | 利用元表实现修饰器

Lua元表和元方法DaemonCoder