Lua 冒号调用与点调用区别

Alexer 发布于 阅读:18 速查

冒号调用是语法糖: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 就变成了第一个实参,容易报错;定义用点、调用用冒号,则会多传一个参数,参数个数对不上。

语法基础 Lua 函数用法