Lua:当类变量被括号括起来时布尔转换解决方法

在以下代码中,有人能解释为什么 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"
点赞
用户2858170
用户2858170

Lua表达式可以跨越多行。

print

(3)

将打印3

所以

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

实际上等同于

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

或者

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

所以你在调用t1:print()的返回值。

为了避免这个问题,按照Egor的建议用分号分隔两个语句。

t1:print();(t1):print()
2019-12-10 08:05:58