Lua:class 变量在括在括号中时进行布尔值转换的解决方法

Lua: Workaround for boolean conversion of a class variable when enclosed in parentheses

在下面的代码中,谁能解释为什么 t1:print() 有效但 (t1):print 失败。我正在尝试使 (t1 * 3):print() 之类的东西在不使用中间变量的情况下工作。

function classTestTable(members)
  members = members or {}
  local mt = {
    __metatable = members;
    __index     = members;
  }

  function mt.print(self)
    print("something")
  end
  return mt
end

TestTable = {}
TestTable_mt = ClassTestTable(TestTable)

function TestTable:new()
   return setmetatable({targ1 = 1}, TestTable_mt )
end

TestTable t1 = TestTable:new()

t1:print() -- works fine. 
(t1):print()  -- fails with error "attempt to call a boolean value"

Lua 表达式可以扩展到多行。

print




(3)

将打印 3

所以

t1:print()
(t1):print()

实际上相当于

t1:print()(t1):print()

local a = t1:print()
local b = a(t1)
b:print()

因此您正在调用 t1:print()

的 return 值

为避免这种情况,请遵循 Egors 的建议并用分号分隔两个语句。

t1:print();(t1):print()