Lua - 只调用metatable中的一个运算符

时间:2013-11-19 15:55:50

标签: lua operators metatable

我是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方法,那么它可以工作..

2 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:4)

我得到的错误是

  

尝试对全局'test'执行算术(零值)

这意味着test在最后一行中为零。您需要在__add中返回一些内容。