例子
1  | local _M = {}  | 
output1
2
3
4
5 lua test.lua
a	b
a	b
table: 0x180ab20	a
b	nil
正常调用没有问题,交叉调用结果看起来非常奇怪。
语法糖
: 其实是 . 的语法糖,默认传了一个self参数到函数内,代表table自己,相当于“ . + self =”,下面两种声明是完全等价的1
2
3
4
5
6
7
8
9function _M.test(self, a, b, ..)
  -- self 需要手动声明
  print(self.a)
end
function _M:test(a, b, ...)
  -- 默认有 self 变量代表自己,可直接使用
  print(self.a)
end
交叉调用,调用方法需依据上文的“等价转换”,转换为声明的格式
若通过:方式调用 . 声明函数,则在所有参数的前面加上一个 self1
m:print("a", "b")  =>  m.print(self, "a", "b")
output1
table: 0x180ab20	a
若通过.方式调用.声明函数,第一个参数”a”,将被当作self,被省略,后续参数被正常传入1
m.echo("a", "b")  =>  m:echo("b")
output1
b	nil