0%

Lua Function Colon vs Dot Operator

例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
local _M = {}

function _M.print(a, b)
print(a, b)
end

function _M:echo(a, b)
print(a, b)
end

local m = _M

-- 正常调用
m.print("a", "b")
m:echo("a", "b")
-- 交叉调用
m:print("a", "b")
m.echo("a", "b")

output

1
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
9
function _M.test(self, a, b, ..)
-- self 需要手动声明
print(self.a)
end

function _M:test(a, b, ...)
-- 默认有 self 变量代表自己,可直接使用
print(self.a)
end

交叉调用,调用方法需依据上文的“等价转换”,转换为声明的格式

若通过:方式调用 . 声明函数,则在所有参数的前面加上一个 self

1
m:print("a", "b")  =>  m.print(self, "a", "b")

output

1
table: 0x180ab20	a

若通过.方式调用.声明函数,第一个参数”a”,将被当作self,被省略,后续参数被正常传入

1
m.echo("a", "b")  =>  m:echo("b")

output

1
b	nil