冒号调用是语法糖:obj:fn(a) 完全等同于 obj.fn(obj, a),它自动把 obj 当作第一个参数 self 传进去;点调用则得自己把对象手动传一遍。定义时规矩一样,冒号定义自动带 self 形参,点定义要自己写 self。
local obj = { name = "Tom" }
-- 点定义:self 要自己写在参数里
function obj.say1(self, msg)
print(self.name .. msg)
end
-- 冒号定义:self 是隐含的第一个参数
function obj:say2(msg)
print(self.name .. msg)
end
obj.say1(obj, "你好") -- 点调用,手动传 self
obj:say2("你好") -- 冒号调用,自动传 self
obj.say2(obj, "你好") -- 和上一行等价
记住一条:定义用冒号,调用也用冒号,最省事。定义用冒号、调用用点,self 就变成了第一个实参,容易报错;定义用点、调用用冒号,则会多传一个参数,参数个数对不上。